
//编译预处理
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
//自定义数据类型
typedef struct
{
int num;
char name[20];
double score;
}STD;
typedef struct lnode
{
STD data;
struct lnode * next;
}lnode,*linklist;
{
STD data;
struct lnode * next;
}lnode,*linklist;
//函数声明
int init(linklist *l);
int insert(linklist l,int i,STD x);
int dele(linklist l,int i,STD *x);
int nameloca(linklist l,char *name);
int disp(linklist l);
int menu();
int init(linklist *l);
int insert(linklist l,int i,STD x);
int dele(linklist l,int i,STD *x);
int nameloca(linklist l,char *name);
int disp(linklist l);
int menu();
//主函数
void main()
{
int n,m,i=0;
STD x;
linklist l,p;
while(1)
{
n=menu();
switch(n)
{
void main()
{
int n,m,i=0;
STD x;
linklist l,p;
while(1)
{
n=menu();
switch(n)
{
//创建链表
case 1:
char yn;
init(&l);
do
{
i++;
printf("请输入第%d个学生信息:",i);
scanf("%d%s%lf",&x.num ,x.name ,&x.score );
getchar();
p=new lnode;
p->data =x;
insert(l,i,x);
printf("继续输入吗?Y/N:");
yn=getchar();
}while(yn=='Y'||yn=='y');
printf("按任意键继续!\n");
getch();
break;
//插入数据
case 2:printf("请输入学生的学号、姓名、分数,用空格隔开\n");
scanf("%d %s %lf",&x.num,x.name ,&x.score );
printf("请输入想要插入的位置:\n");
scanf("%d",&n);
insert(l,n,x);
printf("按任意键继续!\n");
getch();
break;
//根据学生姓名删除信息
case 3:printf("请输入要删除学生的姓名:\n");
char st[20];
scanf("%s",st);
n=nameloca(l,st);
if(dele(l,n,&x))
{
printf("删除的学生数据为:\n");
printf("%d %s %.2f\n",x.num ,x.name ,x.score );
}
printf("按任意键继续!\n");
getch();
break;
//显示学生数据
case 4:
disp(l);
printf("按任意键继续!\n");
getch();
break;
//退出
case 0:exit(0);
}
}
}
//
int init(linklist *l)
{
*l=new lnode;
if(*l==NULL)return 0;
(*l)->next =NULL;
return 1;
}
//
int insert(linklist l,int i,STD x)
{
linklist p=l,s;
int pos =0;
while(p!=NULL&&pos<i-1){p=p->next ;pos++;}
//p记住第i-1个节点,pos记住p指向节点的位置
if(p==NULL||pos>i-1){printf("插入位置不合理\n");return 0;}
//正常情况下pos==i-1
s=new lnode;//生成新节点
s->data =x;
s->next =p->next ;
p->next =s;
return 1;
}
//
int dele(linklist l,int i,STD *x)
{
linklist q,p=l;//p记住头节点
int pos=0;
while(p->next !=NULL&&pos<i-1){p=p->next ;pos++;}
if(p->next ==NULL||pos>i-1){printf("链表为空或删除位置不合理\n"); return 0;}
q=p->next ;
p->next =q->next ;
*x=q->data ;
free(q);
return 1;
}
{
linklist q,p=l;//p记住头节点
int pos=0;
while(p->next !=NULL&&pos<i-1){p=p->next ;pos++;}
if(p->next ==NULL||pos>i-1){printf("链表为空或删除位置不合理\n"); return 0;}
q=p->next ;
p->next =q->next ;
*x=q->data ;
free(q);
return 1;
}
//
int nameloca(linklist l,char *name)
{
linklist p=l->next ;
int n=1;
while(p)
if(strcmp(p->data .name ,name)){p=p->next ;n++;}
else return n;
if(p==NULL)
return 0;
}
{
linklist p=l->next ;
int n=1;
while(p)
if(strcmp(p->data .name ,name)){p=p->next ;n++;}
else return n;
if(p==NULL)
return 0;
}
//
int disp(linklist l)
{
linklist p=l->next ;
if(p==NULL){printf("没有数据!\n");return 0;}
while(p)
{
printf("%d %s %.2f\n",p->data .num ,p->data .name ,p->data .score );
p=p->next ;
}
return 1;
}
//
int menu()
{
int n;
while(1)
{
printf("******欢迎使用新生成及管理系统******\n");
printf("1.创建链表 2.插入新生数据\n");
printf("3.删除数据 4.显示所有数据\n");
printf("0.退出\n");
printf("************************************\n");
printf("请选择功能编号(0-4):\n");
scanf("%d",&n);
getchar();//吃回车
if(n<0||n>4)
printf("输入有误,重新选择,按任意键继续!\n");
else return n;
}
}