链表无法输入超过四组数据,而且为什没有实现头插?
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
char name[10];
long num;
int score[3];
struct Lnode *next;
}Lnode;
Lnode L;
int state=0;
int length=0;
void Homepage();
void list_create(Lnode *L);
void list_insert(Lnode *L);
int list_delete(Lnode *L);
void get_tail_data(Lnode L,int *e);
void print(Lnode *L);
int main(void)
{
Homepage();
return 0;
}
void Homepage()
{
char choice;
while(1){
printf(" \n\tManagement System for Students' Information\n");
printf(" \t\tc--> Create a empty archive\n");
printf(" \t\ts--> Storage students' information\n");
printf(" \t\td--> Delete a student's information\n");
printf(" \t\tg--> Go through the information\n");
printf(" \t\tq--> Quit\n");
printf("Choose what you want to do:\n");
scanf(" %c",&choice);
switch(choice)
{
case 'c':
if(state==0){
list_create(&L);
state=1;
printf("\n **Empty archive be created!**\n");
}
else{
printf("\n **Archive had been created ago!**\n");
}
break;
case 's':
if(state==1){
list_insert(&L);
}
else{
printf("\n **No archive be created,please create the archive firstly!**\n");
}
break;
case 'd':
list_delete(&L);
break;
case 'g':
print(&L);
break;
default:
printf("\n **Quited!**\n");
exit(0);
break;
}
}
}
void list_create(Lnode *L)
{
L->next=NULL;
++length;
}//list_create...
void list_insert(Lnode *L)
{
Lnode *p;
p=(Lnode *)malloc(sizeof(Lnode));
printf("Name:");
scanf("%s",p->name);
printf(" Id:");
scanf("%ld",&p->num);
printf("Scores(Chinese Math English):");
scanf("%d %d %d",&p->score[0],&p->score[1],&p->score[2]);
p->next=L->next;
L->next=p;
L=p;
++length;
printf("\n **Completed!**\n");
}
int list_delete(Lnode *L)
{
long num;
Lnode *p;
p=L;
if(length==0){
printf("\n **No archive be created,please create the archive!**\n");
return 0;
}
else if(length==1 && p->next==NULL){
printf("\n **Archive is empty!**\n");
return 0;
}
printf("ID:");
scanf("%ld",&num);
for(p=L->next;p!=NULL;p=p->next){
if(p->num==num){
L->next=p->next;
free(p);
--length;
printf("\n **Completed!**\n");
}
break;
}
return 0;
}
void print(Lnode *L)
{
Lnode *p=L;
if(length==0){
printf("\n **No archive be created,please create the archive firstly!**\n");
}
else if(length==1 && p->next==NULL){
printf("\n **Students information records is empty!**\n");
}
else{
printf("\nList length is %d\n",length-1);
printf("\n|----------|-------------|--------------------------|");
printf("\n| | | Scores |");
printf("\n| Name | Study-Num |---------|------|---------|");
printf("\n| | | Chinese | Math | English |");
printf("\n|----------|-------------|---------|------|---------|");
for(p=L->next;p!=NULL;p=p->next){
printf("\n| %-7s| %-9ld | %-7d | %-4d | %-7d |\n|----------|-------------|---------|------|---------|",
p->name,p->num,p->score[0],p->score[1],p->score[2]);
}
}
}
//我测过数据,可以输入超过4组.只是删除结点有问题
//这已经是头插法,即每次从头部进行插入.你是想要尾插法?
void list_insert(Lnode *L)
{
Lnode *p;
p=(Lnode *)malloc(sizeof(Lnode));
printf("Name:");
scanf("%s",p->name);
printf(" Id:");
scanf("%ld",&p->num);
printf("Scores(Chinese Math English):");
scanf("%d %d %d",&p->score[0],&p->score[1],&p->score[2]);
p->next=L->next;
L->next=p;
//L=p; //这句是多余的,L是个局部指针,函数完后就释放了
++length;
printf("\n **Completed!**\n");
}
//要删除一个结点需先找到该结点的前驱
int list_delete(Lnode *L)
{
long num;
Lnode *p, *prev;
p=L;
if(length==0){
printf("\n **No archive be created,please create the archive!**\n");
return 0;
}
else if(length==1 && p->next==NULL){
printf("\n **Archive is empty!**\n");
return 0;
}
printf("ID:");
scanf("%ld",&num);
prev=L;
for(p=L->next;p!=NULL;p=p->next){
if(p->num==num){
prev->next=p->next; //前驱的下一个结点指向要删除结点的下一个结点,即将该结点删除了
free(p);
--length;
printf("\n **Completed!**\n");
break;
}
//break; //还不能break,应该写到if括号里
prev=p;
}
return 0;
}
//L=p; //这句是多余的,L是个局部指针,函数完后就释放了