1、C语言双链表简单操作#include#include#includetypedef enum false = 0, true = 1 bool;void init_stu();void insert_stu();void delete_stu();bool select_stu();void modifly_stu();void archive_stu();void readInfo_stu();char *getNameById(int);struct Students int num; char name20; struct Students *pre; struct Students *
2、next;struct Students *ptr, *tail, *current, *head;int sel_id; /存放学生的学号/初始化链表,头结点num存放现有的学生个数,name没有具体含义void init_stu() ptr = (struct Students *)malloc(sizeof(struct Students); ptr-num = 0; /学生数,初始值0 strcpy(ptr-name, HeadPointer!); ptr-next = ptr; ptr-pre = ptr; head = tail = ptr; /按学号顺序从小到大排序加入学生/学号
3、为主码,不允许相同void insert_stu() char flag; do ptr = (struct Students *)malloc(sizeof(struct Students); printf(n请输入学生的学号:n); scanf(%d, &ptr-num); /判断学号是否已经存在,如存在则不允许继续输入 if(isExistId(ptr-num) printf(学号已存在,请重新输入!n); continue; printf(请输入学生的姓名:n); scanf(%s, ptr-name); tail = head; current = head-next; /查找合适位
4、置 while(current != head & current-num num) tail = current; current = current-next; /插入合适位置 ptr-next = current; ptr-pre = tail; tail-next = ptr; current-pre = ptr; /学生数加1 head-num +; printf(添加成功,是否继续添加(y/n)n); flag = getch(); while(Y = flag | y = flag);/按学号删除学生记录void delete_stu() int del_id; char *de
5、l_name; char flag; printf(n请输入待删除学生的学号:n); scanf(%d, &del_id); /查找是否有该学号 if(!isExistId(del_id) printf(该学号不存在!n); return; /如果有该学号,返回该学生的信息判断是否应该删除 del_name = getNameById(del_id); printf(待删除的学生信息为:n); printf(学号tt姓名n); printf(%dtt%sn, del_id, del_name); printf(确认删除(y/n)?n); flag = getch(); if(!(y = fla
6、g | Y = flag) return; /开始删除 tail = head; current = head-next; while(current-num != del_id) tail = current; current = current-next; tail-next = current-next; current-next-pre = tail; free(current); /学生数减1 head-num-; printf(n删除成功!n);/按学号查询学生信息,return value: true(学号存在) false(学号不存在)bool select_stu() cha
7、r *sel_name = NULL; printf(n请输入学生的学号:n); scanf(%d, &sel_id); if(!isExistId(sel_id) printf(n学号不存在!n); return false; sel_name = getNameById(sel_id); printf(学生的信息为:n); printf(n学号tt姓名n); printf(%dtt%sn, sel_id, sel_name); return true;/通过学号修改学生的信息(只做了姓名修改)void modifly_stu() char new_name20; char flag; if
8、(!select_stu() return; printf(请输入新的名字:n); scanf(%s, new_name); printf(确认修改?(y/n)n); flag = getch(); if(y = flag | Y = flag) /开始修改 current = head-next; while(current-num != sel_id) current = current-next; strcpy(current-name, new_name); printf(修改成功!n); /保存学生信息到本地void archive_stu() FILE *output; if(0
9、= head-num) printf(n无学生数据!nn); return; if(output = fopen(StudentsInfo.txt, w) = NULL) printf(无法打开文件!n); return; /写入磁盘 current = head; do fprintf(output, %d %sn, current-num, current-name); current = current-next; while(current != head); fclose(output); printf(n保存成功!n);/从本地读取学生信息void readInfo_stu() i
10、nt stu_id; char stu_name20; bool isHead = true; FILE *input; if(0 != head-num) printf(n已有记录输入,不允许再录入!n); return; if(input = fopen(StudentsInfo.txt, r) = NULL) printf(无法打开文件!n); return; tail = head; current = head-next; /录入学生信息 while(fscanf(input, %d %s, &stu_id, stu_name) = 2) /录入头结点信息 if(isHead) ta
11、il-num = stu_id; strcpy(tail-name, stu_name); isHead = false; continue; ptr = (struct Students *)malloc(sizeof(struct Students); ptr-num = stu_id; strcpy(ptr-name, stu_name); tail-next = ptr; ptr-pre = tail; ptr-next = current; current-pre = ptr; tail = current; current = current-next; printf(n录入完毕!
12、n); fclose(input);/显示记录void display() if(0 = head-num) printf(n无学生数据!nn); return; current = head-next; printf(n学号tt姓名n); while(current != head) printf(%dtt%sn, current-num, current-name); current = current-next; printf(共有%d条记录!, head-num);/查找是否存在指定的学号 true代表存在,false表示不存在该学号bool isExistId(int id) cur
13、rent = head-next; while(current != head) if(current-num = id) return true; current = current-next; return false;/通过学号,返回学生的姓名char *getNameById(int del_id) current = head-next; while(current-num != del_id) current = current-next; return current-name; int main(void) char number; init_stu(); while(true) printf(n-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1