C语言完成 链表的建立、查询、删除操作

    xiaoxiao2023-10-28  178

    C语言完成链表的建立、查询、删除操作,同时掌握链表与文件的联合应用

    注释:在Windows环境下使用Dev C++或visual studio 2019完成

    要求:

    1.建立单链表,每个节点包括学号、姓名、性别、年龄和计算机成绩。实现按学号删除链表中的指定节点的功能

    2.将1中的链表拆分成两个链表b和c,b中存放80分以上成绩的节点,c中存放其他节点

    3.将1中的链表改为按计算机成绩递增顺序排列的链表,并统计出高于平均分的成绩人数

    4.输入新的节点,插入到3中的递增顺序链表中。

    #include "stdlib.h" #include "string.h" struct T { long num; char name[20]; char sex; int age; float score; struct T *next; }; typedef struct T Node; //============= 建立 =============== Node *Create() //建立带头结点的链表 { long no; Node *p0,*p,*q; p0=(Node *) malloc(1*sizeof(Node)); if(p0==NULL) { printf("Cannot create a node\n"); exit(0); } p0->next=NULL; p=p0; while(1) { printf("\n请输入学号(输入-1结束):"); scanf("%ld",&no); if(no==-1) break; q=(Node *) malloc(1*sizeof(Node)); if(q==NULL) { printf("无法创建链表\n"); exit(0); } q->num=no; printf("请输入姓名: "); scanf("%s",q->name); printf("请输入性别: "); getchar(); //接收回车 scanf("%c",&q->sex); printf("请输入年龄:"); scanf("%d",&q->age); printf("请输入计算机成绩:"); scanf("%f", &q->score); q->next=NULL; p->next=q; p=q; } return p0; } //============= 排序 ================= void Sort_Link(Node *p0) { long num; char name[20]; char sex; int age; float score; Node *p, *q, *r; p=p0->next; while(p!=NULL) { r=p; q=p->next; while(q!=NULL) { if(q->score<r->score) r=q; q=q->next; } if(p!=r) { num=p->num; strcpy(name,p->name); sex=p->sex; age=p->age; score=p->score; p->num=r->num; strcpy(p->name, r->name); p->sex=r->sex; p->age=r->age; p->score=r->score; r->num=num; strcpy(r->name,name); r->sex=sex; r->age=age; r->score=score; } p=p->next; } printf("由小到大排序后为:\n"); return; } //============ 拆分 ============== void Division_Link(Node *p0, Node **p1, Node **p2) { Node *p, *q1, *q2; q1=p0; q2=(Node *) malloc(1*sizeof(Node)); if(q2==NULL) { printf("无法创建链表\n"); exit(0); } *p1=q1; *p2=q2; p=p0->next; while(p) { if(p->score>=80) { q1->next=p; q1=p; } else { q2->next=p; q2=p; } p=p->next; } q1->next=NULL; q2->next=NULL; return; } //==============删学号=========== void Delete_link(Node *p0, long no) { Node *p,*q; p=p0; q=p->next; while(q && q->num!=no) { p=q; q=p->next; } if(q==NULL) printf("没有发现该学生!\n"); else { p->next=q->next; free(q); } return ; } //============ 统计 ============== void Count_Link(Node *p0) { int n=0; Node *p; float aver,sum=0; p=p0->next; while(p) { n++; sum+= p->score; p=p->next; } aver=sum/n; //平均成绩 n=0; p=p0->next; while(p) { if (p->score>=aver ) n++; p=p->next; } printf("大于等于平均成绩有%d人。\n",n); return; } //============ 输出 ============== void Output_Link(Node *p0) //输出链表 { Node *p; printf("=========================\n"); p=p0->next; while(p) { printf("学号\t姓名\t性别\t\年龄\t计算机成绩\n"); printf("%ld\t%s\t%c\t%d\t%.2f\n",p->num, p->name,p->sex, p->age, p->score); p=p->next; } printf("========================\n\n"); return ; } //=================================== int main() { long num; Node *a,*b,*c; printf("创建链表:\n"); a=Create(); Output_Link(a); printf("请输入需要删除的学号:"); scanf("%ld",&num); Delete_link(a, num); Output_Link(a); Sort_Link(a) ; Output_Link(a); Division_Link(a,&b,&c); printf("分数大于等于80的学生有:\n"); Output_Link(b); printf("分数小于80的学生有:\n"); Output_Link(c); system("pause"); return 0; }

    谢谢!

    最新回复(0)