c语言无空头和有空头的区别,无空头的链表代码:学生管理系统

/*

*程序

*/

//********学员管理

#include

#include

#include

//#include "he.c"

typedef struct STU{

int num;//学号

char name[20];//姓名

double score;//分数

struct STU *next;

}node,*linklist;

int node_count=0;

int getlen(linklist head)

{

node *p;

int count=0;

p=head->next;

while(p!=NULL)

{

count++;

p=p->next;

}

return count;

}

int menu()

{

int select;

printf("1,录入学员信息\n");

printf("2,显示学员信息\n");

printf("3,修改学员信息\n");

printf("4,删除学员信息\n");

printf("5, 排序\n");

printf("6,退出\n");

printf("请输入你的选择:");

scanf("%d",&select);

return select;

}

int menu2()

{

int select;

printf("请输入查找依据\n");

printf("1,按编号查找\n");

printf("2,按姓名查找\n");

printf("3,按学号查找\n");

printf("4,返回上级菜单\n");

printf("请输入你的选择:");

scanf("%d",&select);

return select;

}

int menu3()

{

int select;

printf("1,按姓名排序\n");

printf("2,按学号排序\n");

printf("3,按分值排序\n");

printf("4, 返回上级菜单\n");

printf("请输入你的选择:");

scanf("%d",&select);

return select;

}

void input(node *p)

{

printf("\n");

printf("请输入学员学号\n");

scanf("%d",&p->num);

//fflush(stdin);//清空输入缓冲区,清除多余的换行符

printf("请输入学员姓名\n");

scanf("%s",p->name);

printf("请输入学员分数\n");

scanf("%lf",&p->score);

}

void output(node *p)

{

printf("--------------------------------\n");

printf("姓名:%s\n",p->name);

printf("学号:%d\n",p->num);

printf("成绩:%f\n",p->score);

printf("--------------------------------\n");

}

void initiallist(linklist *p)

{

(*p)=(node *)malloc(sizeof(node));

(*p)->next=NULL;

}

int mod(linklist L,int i)

{

node *p;

int j;

if(i<1||i>getlen(L))

{

printf("输入信息非法!\n");

return 0;

}

p=L->next;

for(j=1;j

{

p=p->next;

}

printf("请输入第%d同学的更改信息",i);

input(p);

return 1;

}

int inputlist(linklist L)

{

node *p,*q;

int j;

//static int node_count=0;

node_count++;

printf("请输入第%d个学生的信息\n",node_count);

p=L;

for(j=1;j

{

p=p->next;

}

q=(node *)malloc(sizeof(node));

p->next=q;

p=q;

input(p);

p->next=NULL;

return 0;

}

int del(linklist L,int i)

{

node *p,*q;

int j;

if(i<1||i>getlen(L))

{

printf("输入不合法\n");

return 0;

}

p=L;

q=L->next;

for(j=1;j

{

p=q;

q=q->next;/*p->next=q->next;p=q;q=q->next;*/

}

p->next=q->next;

free(q);/*p->next=NULL;free(p);*/

node_count--;

return 1;

}

int outputlist(linklist L)

{

int count=1;

while(L->next!=NULL)

{

L=L->next;

printf("**************第%d个学生********\n",count);

output(L);

count++;

}

return 0;

}

node *SearchBySerial(linklist L,int num)

{

intj=1;

node *p;

p=L;

if(num<1||(getlen(L)

{

printf("输入越界!");

return NULL;

}

while(p->next!=NULL&&j<=num)

{

p=p->next;

j++;

}

return p;

}

node *SearchByName(linklist L,char *name[])

{

node *p;

p=L->next;

while(p!=NULL&&strcmp(name,p->name)!=0)

{

p=p->next;

}

return p;

}

node *SearchByID(linklist L,int stuID)

{

intj=1;

node *p;

p=L->next;

while(p!=NULL&&stuID!=p->num)

{

p=p->next;

j++;

}

return p;

}

/*------------------------------------------------------------------------------

这是我的代码

*------------------------------------------------------------------------------*/

int bubblesort(linklist L)

{

int len,i,j;

node *tmp,*pf,*p,*tail=NULL;

len=getlen(L);

/*pf=L;

p=pf->next;*/

for(i=0;i

{

pf=L;

p=pf->next;

for(j=1;j

{

if(strcmp(p->name,p->next->name)==1)

{

pf->next=p->next;

p->next=pf->next->next;

pf->next->next=p;

p=pf->next;

/* 也可以这一段 */

/*pf->next=p->next;

tmp=p->next->next;

p->next->next=p;

p->next=tmp;

p=pf->next;*/

}

pf=pf->next;

p=p->next;

}

}

}

int main()

{

linklist head;

int choose=0,choose1=0,choose3=0,del_i,j=0;

int num,stuID;

char name[20];

initiallist(&head);

while(choose != 6)

{

choose=menu();

switch(choose)

{

case 1:

{

inputlist(head);

}

break;

case 2:

{

outputlist(head);

}

break;

case 3:

choose1=0;

while(choose1!=4)

{

choose1=menu2();

j=0;

switch(choose1)

{

case 1:

{

printf("请输入要查找的编号:");

scanf("%d",&num);

if(SearchBySerial(head,num)!=NULL)

{

printf("------------根据编号查找,找到,请修改--------------\n");

output(SearchBySerial(head,num));

mod(head,num);

}

else

printf("按编号未找到!\n");

}

break;

case 2:

{

printf("请输入要查找的姓名:");

scanf("%s",name);

if(SearchByName(head,name)!=NULL)

{

printf("------------根据姓名查找,找到,请修改--------------\n");

output(SearchByName(head,name));

input(SearchByName(head,name));

}

else

printf("按姓名未找到!\n");

}

break;

case 3:

{

printf("请输入要查找的学号:");

scanf("%d",&stuID);

if(SearchByID(head,stuID)!=NULL)

{

printf("------------根据学号查找,找到,请修改--------------\n");

output(SearchByID(head,stuID));

input(SearchByID(head,stuID));

}

else

printf("按姓名未找到!\n");

}

break;

default:

break;

}

}

break;

case 4:

{

printf("输入要删除的学生的编号\n");

scanf("%d",&del_i);

del(head,del_i);

}

case 5:

{

choose3=0;

while(choose3!=4)

{

choose3=menu3();

j=0;

bubblesort(head);

}

}

break;

//......

default:

break;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值