麻烦了!!! 没有写什么注释 , 这个毛病要改改! 呵呵 , 还好代码比较简单
[ 本帖最后由 missu_1314 于 2012-2-14 15:20 编辑 ]
[ 本帖最后由 missu_1314 于 2012-2-14 15:20 编辑 ]
#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; }