首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

链表没法输入超过四组数据,而且为什没有实现头插

2013-03-21 
链表无法输入超过四组数据,而且为什没有实现头插?#includestdio.h#includestdlib.htypedef struct Lno

链表无法输入超过四组数据,而且为什没有实现头插?


#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]);
        }
    }
}


[解决办法]
不能头插是不是insert中多一句 L->next=p; 
无法输入超过四组数据,应该和scanf有关,可能需要刷新缓冲区
[解决办法]

//我测过数据,可以输入超过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是个局部指针,函数完后就释放了

这个指针不会释放吧?

热点排行