| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 843 人关注过本帖
标题:哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功,但 ...
只看楼主 加入收藏
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
收藏
得分:0 
麻烦了!!!  没有写什么注释  , 这个毛病要改改! 呵呵  , 还好代码比较简单

[ 本帖最后由 missu_1314 于 2012-2-14 15:20 编辑 ]
2012-02-14 15:16
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
恩,我抽个时间帮你改改

我的地盘
2012-02-14 15:35
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
不好意思,由于你的代码确实写得不规范,阅读性差,改起来需要多点时间,我就用自己的风格给你写了个,请见谅。
程序代码:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
/*
建的是带头结点为空的单链表。
下面是我提的几点建议:
当函数有返回值的时候,你就没添加函数返回值类型声明
写这种模块式的程序,记得要简化函数的功能,尽可能的让某个函数完成某项单一的功能,这样容易发现问题,也容易解决。
先从框架做起,然后再逐步细化下去。
你所提到的问题还是在函数参数传值与传址的问题,这在每本讲c的书上都会在函数那章有说明的。
有时候你都不确定你用的指针指向了哪里,建议多在纸上画画。
某些函数还可以进一步简化,增加联系,可以尝试去修改。
*/
typedef struct Student
{
    char name[20];
    char  mark[5];        //输入的习惯性策略都是字符串
    struct Student *next;
} Node, *node;
node LHead;    //头结点

void Search_All(void)  //链表整体输出
{
    node p;
    p = LHead -> next;
    while(p != NULL)
    {
        printf("姓名:%s\t分数:%s\n", p->name, p->mark);
        p = p->next;
    }
}
void Search_Single(void)  //单一元素查询
{
    char name[20];
    node p;
    p = LHead -> next;
    printf("请输入你要查询学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name,p->name) == 0)
        {
            printf("该学生的分数为:%s\n",  p->mark);
            break;  
        }
        p = p->next;
    }
    if (NULL == p)
        printf ("没有找到该学生!\n");
}
void Del_Single(void)  //删除单一元素
{
    node p, q, head;
    head = p = LHead->next;
    char name[20];
    printf("请输入你要删除学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name, p->name) == 0)
        {
            //删除节点可以分2种情况,一是头结点,二是其他结点
            if(head == p)
            {
                LHead->next = p->next;
            }
            else
            {
                q->next = p->next;
            }
            free(p);
            printf("该学生记录已删除\n");
            break;
        }
        q = p;
        p = p->next;
    }
    if (p == NULL)
        printf ("没有找到该学生!\n");
}
void Add_Single(void)  //增加新的学生信息,根据姓名排序
{
    node p, q, old, head;
    head = q = LHead -> next;
    p = (node)malloc(sizeof(Node));
    if (p == NULL)
    {
        printf("内存分配失败!");
        exit(1);
    }
    printf("输入增加的学生姓名:");
    gets(p->name);
    printf("输入增加的学生分数:");
    gets(p->mark);
    //插入信息也有四种情况,一种是空表情况,二种是插入表头,三种是插入表中,四是插入表尾
    if (NULL == q)
    {
        LHead -> next = p;
        p -> next = NULL;
    }
    else
    {
        while(q != NULL)
        {
            if (strcmp(p->name, q->name) == 0)
            {
                //此时所输账号相同
                printf("此学生姓名早已存在。\n");
                break;
            }
            else if(strcmp(p->name, q->name) < 0)
            {
                if(head == q)
                {
                    //放表头
                    LHead -> next = p;
                    p ->next = q;
                }
                else
                {
                    //放表中
                    old->next = p;
                    p->next = q;
                }
                break;
            }
            old = q;
            q = q->next;
        }
        if(q == NULL)
        {
            //放表尾
            old -> next = p;
            p -> next = NULL;
        }
    }
}
int menu(void)     //显示主菜单函数
{
    char s[20];
    int c;
    system("cls");
    printf("\t\t*****************学生信息管理系统*****************\n");
    printf("\t\t*\t\t|1.学生信息录入                   *\n");
    printf("\t\t*\t\t|2.学生信息浏览                   *\n");
    printf("\t\t*\t\t|3.学生信息查询                   *\n");
    printf("\t\t*\t\t|4.学生信息删除                   *\n");
    printf("\t\t*\t\t|5.退出系统                       *\n");
    printf("\t\t*****************学生信息管理系统*****************\n\n\n");
    printf("\t\t请输入以上序号进行选择:\n");
    do{
          gets(s);
          c = atoi(s);
    }while(c<0||c>8);
    return c;
}
int main(void)
{
    LHead = (node)malloc(sizeof(Node));
    LHead ->next = NULL;
    while(1)
    {
        switch(menu())
        {
            case 1:Add_Single();system("pause");//录入
                   break;
            case 2:Search_All();system("pause");//浏览
                   break;
            case 3:Search_Single();system("pause");//查询
                   break;
            case 4:Del_Single();system("pause");//删除
                   break;
            case 5:exit(0);
        }//end switch
    }//end while
    system("pause");
    return 0;
}


我的地盘
2012-02-14 20:30
missu_1314
Rank: 2
等 级:论坛游民
帖 子:46
专家分:98
注 册:2010-9-8
收藏
得分:0 
以下是引用hnuhsg1226在2012-2-14 20:30:25的发言:

不好意思,由于你的代码确实写得不规范,阅读性差,改起来需要多点时间,我就用自己的风格给你写了个,请见谅。#include
#include
#include
#include
/*
建的是带头结点为空的单链表。
下面是我提的几点建议:
当函数有返回值的时候,你就没添加函数返回值类型声明
写这种模块式的程序,记得要简化函数的功能,尽可能的让某个函数完成某项单一的功能,这样容易发现问题,也容易解决。
先从框架做起,然后再逐步细化下去。
你所提到的问题还是在函数参数传值与传址的问题,这在每本讲c的书上都会在函数那章有说明的。
有时候你都不确定你用的指针指向了哪里,建议多在纸上画画。
某些函数还可以进一步简化,增加联系,可以尝试去修改。
*/
typedef struct Student
{
    char name[20];
    char  mark[5];        //输入的习惯性策略都是字符串
    struct Student *next;
} Node, *node;
node LHead;    //头结点
 
void Search_All(void)  //链表整体输出
{
    node p;
    p = LHead -> next;
    while(p != NULL)
    {
        printf("姓名:%s\t分数:%s\n", p->name, p->mark);
        p = p->next;
    }
}
void Search_Single(void)  //单一元素查询
{
    char name[20];
    node p;
    p = LHead -> next;
    printf("请输入你要查询学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name,p->name) == 0)
        {
            printf("该学生的分数为:%s\n",  p->mark);
            break;   
        }
        p = p->next;
    }
    if (NULL == p)
        printf ("没有找到该学生!\n");
}
void Del_Single(void)  //删除单一元素
{
    node p, q, head;
    head = p = LHead->next;
    char name[20];
    printf("请输入你要删除学生的姓名:");
    gets(name);
    while (p != NULL)
    {
        if (strcmp(name, p->name) == 0)
        {
            //删除节点可以分2种情况,一是头结点,二是其他结点
            if(head == p)
            {
                LHead->next = p->next;
            }
            else
            {
                q->next = p->next;
            }
            free(p);
            printf("该学生记录已删除\n");
            break;
        }
        q = p;
        p = p->next;
    }
    if (p == NULL)
        printf ("没有找到该学生!\n");
}
void Add_Single(void)  //增加新的学生信息,根据姓名排序
{
    node p, q, old, head;
    head = q = LHead -> next;
    p = (node)malloc(sizeof(Node));
    if (p == NULL)
    {
        printf("内存分配失败!");
        exit(1);
    }
    printf("输入增加的学生姓名:");
    gets(p->name);
    printf("输入增加的学生分数:");
    gets(p->mark);
    //插入信息也有四种情况,一种是空表情况,二种是插入表头,三种是插入表中,四是插入表尾
    if (NULL == q)
    {
        LHead -> next = p;
        p -> next = NULL;
    }
    else
    {
        while(q != NULL)
        {
            if (strcmp(p->name, q->name) == 0)
            {
                //此时所输账号相同
                printf("此学生姓名早已存在。\n");
                break;
            }
            else if(strcmp(p->name, q->name) < 0)
            {
                if(head == q)
                {
                    //放表头
                    LHead -> next = p;
                    p ->next = q;
                }
                else
                {
                    //放表中
                    old->next = p;
                    p->next = q;
                }
                break;
            }
            old = q;
            q = q->next;
        }
        if(q == NULL)
        {
            //放表尾
            old -> next = p;
            p -> next = NULL;
        }
    }
}
int menu(void)     //显示主菜单函数
{
    char s[20];
    int c;
    system("cls");
    printf("\t\t*****************学生信息管理系统*****************\n");
    printf("\t\t*\t\t|1.学生信息录入                   *\n");
    printf("\t\t*\t\t|2.学生信息浏览                   *\n");
    printf("\t\t*\t\t|3.学生信息查询                   *\n");
    printf("\t\t*\t\t|4.学生信息删除                   *\n");
    printf("\t\t*\t\t|5.退出系统                       *\n");
    printf("\t\t*****************学生信息管理系统*****************\n\n\n");
    printf("\t\t请输入以上序号进行选择:\n");
    do{
          gets(s);
          c = atoi(s);
    }while(c<0||c>8);
    return c;
}
int main(void)
{
    LHead = (node)malloc(sizeof(Node));
    LHead ->next = NULL;
    while(1)
    {
        switch(menu())
        {
            case 1:Add_Single();system("pause");//录入
                   break;
            case 2:Search_All();system("pause");//浏览
                   break;
            case 3:Search_Single();system("pause");//查询
                   break;
            case 4:Del_Single();system("pause");//删除
                   break;
            case 5:exit(0);
        }//end switch
    }//end while
    system("pause");
    return 0;
}
你调试了吗?  这代码我放我的机子上调试  提示错误!!  我发现不了问题!  


2012-02-14 22:56
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
哥哥,我没调试过会贴出来?我用的是DEV C++编译器

我的地盘
2012-02-15 09:07
快速回复:哪位大侠帮我看看,百思不得其解! 链表增加学生记录最后提示增加成功 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034153 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved