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;
}
谢谢!