#include<stdio.h>
#include<stdlib.h>
typedef struct{
int num;
int score;
}stu;
typedef struct list{
stu c;
list *next;
}list;
void setlist(list* L){
int n,s,x;
list a=(list)malloc(sizeof(list));
scanf("%d%d",&a->c.num,&a->c.score);
x=a->c.num;
while(x=-1)
{L->next=a;
L=a;
list a=(list)malloc(sizeof(list));
scanf("%d%d",&a->c.num,&a->c.score);
x=a->c.num;
}
}
void printlist(list* L){
list* p;
while(L->next){
p=L->next;
printf("学号:%d,分数:%d\n",p->c.num,p->c.score);
L=p;}
}
void findlist(list* L,int i){
while(L->next&&L->next->c.num!=i)
{L=L->next;}
if(L->next)
printf("学号:%d,分数:%d\n",L->next->c.num,L->next->c.score);
else
printf("find fail");
}
void deletelist(list* L,int i){
list *q,*p=L->next;
while(p&&p->c.num!=i-1)
{p=p->next;}
if(p)
if(!p->next)
printf("delete fail(no exist this num)");
else
{q=p->next;
p->next=q->next;
free(q);}
else
printf("delete fail");
}
void insertlist(list* L,int i){
list *p=L->next;
while(p&&p->c.num!=i-1)
{p=p->next;}
if(p) {
list a=(list)malloc(sizeof(list));
scanf("%d%d",a->c.num,a->c.score);
a->next=p->next;
p->next=a;}
else
printf("insert fail");
}
int main(){
list L;
int i,c;
printf("\n");
printf("信息表\n");
printf("--1.建表--2.遍历--\n");
printf("--3.查找--4.删除--\n");
printf("--5.插入--6.退出--\n");
printf("-\n");
printf("请输入序号:");
scanf("%d",&i);
switch(i)
{
case 1:setlist(&L);break;
case 2:printlist(&L);break;
case 3:printf("\n请输入要查找的数:");scanf("%d",&c);findlist(&L,c);break;
case 4:printf("\n请输入要删除的数:");scanf("%d",&c);deletelist(&L,c);break;
case 5:printf("\n请输入要插入的数:");scanf("%d",&c);insertlist(&L,c);break;
case 6:exit(0);break;
default:printf("input error");}
return 0;
}
你这里说的输入 -1 不能退出,应该指的是建表的时候,输入的 num 为-1却不会退出。
假设我猜的是对的,这个原因就是你建表函数中的 while 循环终止条件不对,应该是while(x != -1)
还有就是,你有三处,使用 malloc 为新的 list 节点申请空间的时候,应该使用这种方式:
list *a = (list*)malloc(sizeof(list));
申请空间,你得到的应该是指向那块空间的地址,用于存放结构体,而不是直接获得了一个结构体,应该是结构体类型的指针。