user-0 提问: （有一部分错了）用单链表实现一个学生信息管理系统，     学生信息为如下表格，系统功能要求对学生信息进行录入，显示，插入一个新学生信息，删除一个学生，并实现

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct Student {     char no[10];     char name[20];     int age;     char leaveSch; }elemtype;   typedef struct node {     elemtype      data;     /*数据域*/     struct node *next;     /*指针域*/ }linklist;   linklist *InitList(linklist *L)     /*建立一个带头结点的单链表*/ {     L = (linklist*)malloc(sizeof(linklist));     L->next = NULL;     return(L); }  /*通过输入n个数据，创建一个单链表*/ linklist *CreateList(int n) {     int i;     char no[10];     char name[20];     int  age;     char leaveSch;      /*设数据元素的类型为int*/     linklist  *L = NULL, *r, *p;     L = InitList(L);     /*构建头结点空间*/     r = L;     for(i=1;i<=n;i++)/*循环构建n个结点*/     {         printf("\n 请输入学生信息,以回车键间隔:");         scanf("%s",no);         scanf("%s",name);         scanf("%d",&age);         //fflush(stdin);         getchar();         scanf("%c", &leaveSch);         p = (linklist *)malloc(sizeof(linklist));         strcpy(p->data.no, no);         strcpy(p->data.name, name);         p->data.age = age;         p->data.leaveSch = leaveSch;         p->next = NULL;         r->next = p;         r = r->next;         /*指针r始终指向链表中末数据元素所在位置*/     }      return(L); }   void output(linklist  *L)     /*输出链表的值*/ {     linklist *p;     p = L->next; /*p为第一个结点的指针*/      printf("\noutput element：\n");     for( ; p; p = p->next) {         printf("%s  ", p->data.no);         printf("%s  ", p->data.name);         printf("%d  ", p->data.age);         printf("%c\n", p->data.leaveSch);     } }   int InsItem (linklist *L, int i) {     int j;     char no[10];     char name[20];     int  age;     char leaveSch;     linklist *p,  *t;     p = L;     j=1;     printf("请输入你想要插入的学生信息:\n");     scanf("%s",no);     scanf("%s",name);     scanf("%d",&age);     //fflush(stdin);     getchar();     scanf("%c",&leaveSch);     t=(linklist*)malloc(sizeof(linklist)); /*生成新结点t*/     strcpy(t->data.no,no);     strcpy(t->data.name,name);     t->data.age=age;     t->data.leaveSch=leaveSch;     if(L->next == NULL)     {         if(i==0)         {             L->next = t;             t->next = NULL;             return(1);         }         else             return 0;     }     while((p->next!=NULL) && (j<i)) /*查找第i个结点*/     {         p = p->next;         j++;     }     if ((p->next==NULL)  && (j<i))         /*在表中不存在插入位置i ，找不到，则插入操作失败*/     {         printf("The node %d is not exist\n", i);         return(0);     }     else         /*若找到第i个结点，则在第i个结点前插入新结点*/     {         t->next = p->next;         p->next = t;         return 1;     } }    int DelItem ( linklist *L, int i) {/*删除给定序号的结点*/     int j;     linklist *p, *q;     p=L;     j=1;     if( L->next==0)         /*L为空表，无结点可删除*/     {         printf("The linklist is empty.\n");         return(0);     }     while((p->next!=0) && (j<i)) /*查找第i个结点*/     {         p=p->next;         j++;     }     if(p->next == NULL)         /*若没有第i个结点，则删除操作失败*/     {         printf("he node %d is not exist\n", i);         return(0);     }     else         /*若找到第i个结点，则删除并释放第i个结点*/     {         q = p->next;         p->next = p->next->next;         free(q);         return(1);     } }   int loclItem(linklist *L, char *item) {     linklist *p;     int i;     p = L->next;     i = 1;      while (p) {         if (strcmp(p->data.no, item)==0) {             return i;         }         p = p->next;         i++;     }     return 0; }   int main() {     linklist  *L;     int i;     char item[10];     L=CreateList(3);     output(L);     printf("\n请输入你想要插入学生的位置\n");     scanf("%d", &i);     InsItem(L,i);     output(L);     printf("\n请输入你想删除的学生的位置\n");     scanf("%d", &i);     DelItem(L,i);     output(L);     printf("\n请输入你要查找的学生的No\n");     scanf("%s", item);     i = loclItem(L, item);     printf("你要查找的学生在第%d位", i);     return 0; } 调用localItem前，输入scanf("%s", item);去掉前面的&,并且将上面描述“要查找的学生的位置”改成“学生的No"，如果是位置，那么是一个整型，输入的时候就是scanf("%d", &no);

user: user-2
content: strcpy要求的是字符串，未必以\0结尾，但你下面的p->data.no不是  p=( linklist *)malloc(sizeof(linklist)); strcpy(p->data.no,no);   scanf("%s", &item);  最好改成：  scanf("%s", item);

user: user-0
content: #include<stdio.h>   typedef struct Student {   char no[10];   char name[20];    int age;   char leaveSch; }elemtype;   typedef struct node {     elemtype      data;     /*数据域*/     struct node *next;     /*指针域*/ }linklist;   linklist *InitList(linklist *L)       /*建立一个带头结点的单链表*/ {     L=(linklist*)malloc(sizeof(linklist));     L->next=NULL;     return(L); }   linklist *CreateList(int n) /*通过输入n个数据，创建一个单链表*/  {     int x,i;     char no[10];     char name[20];     int  age;     char leaveSch; /*设数据元素的类型为int*/     linklist  *L, *r, *p;     L=InitList(L); /*构建头结点空间*/     r=L;     for(i=1;i<=n;i++) /*循环构建n个结点*/     {         printf("\n 请输入学生信息,以回车键间隔:");         scanf("%s",no);         scanf("%s",name);         scanf("%d",&age);         fflush(stdin);         scanf("%c",&leaveSch);         p=( linklist *)malloc(sizeof(linklist));         strcpy(p->data.no,no);         strcpy(p->data.name,name);         p->data.age=age;         p->data.leaveSch=leaveSch;         p->next=NULL;         r->next=p;         r=r->next; /*指针r始终指向链表中末数据元素所在位置*/     }     return(L); }   void output(linklist  *L) /*输出链表的值*/ {     int i;     linklist *p;     p=L->next; /*p为第一个结点的指针*/     printf("\noutput element：\n");     for( ;p!=NULL;p=p->next)     {         printf("%s  ",p->data.no);         printf("%s  ",p->data.name);         printf("%d  ",p->data.age);         printf("%c  \n",p->data.leaveSch);     } }   int InsItem (linklist *L, int i) {     int j;     char no[10];     char name[20];     int  age;     char leaveSch;     linklist *p,  *t;     p=L;     j=1;     printf("请输入你想要插入的学生信息:\n");     scanf("%s",no);     scanf("%s",name);     scanf("%d",&age);     fflush(stdin);     scanf("%c",&leaveSch);     t=(linklist*)malloc(sizeof(linklist)); /*生成新结点t*/     strcpy(t->data.no,no);     strcpy(t->data.name,name);     t->data.age=age;     t->data.leaveSch=leaveSch;     if(L->next == NULL)     {         if(i==0)         {             L->next = t;             t->next = NULL;             return(1);         }         else return 0;     }     while((p->next!=NULL) && (j<i)) /*查找第i个结点*/     {         p=p->next;         j++;     }     if ((p->next==NULL)  && (j<i))   /*在表中不存在插入位置i ，找不到，则插入操作失败*/     {         printf("The node %d is not exist\n", i);         return(0);     }     else  /*若找到第i个结点，则在第i个结点前插入新结点*/     {         t->next=p->next;         p->next= t;         return(1);     } }     int DelItem ( linklist *L, int i) {/*删除给定序号的结点*/     int j;     linklist *p, *q;     p=L;     j=1;     if( L->next==0)  /*L为空表，无结点可删除*/     {         printf("The linklist is empty.\n");         return(0);     }     while((p->next!=0) && (j<i)) /*查找第i个结点*/     {         p=p->next;         j++;     }     if(p->next==NULL) /*若没有第i个结点，则删除操作失败*/     {         printf("he node %d is not exist\n", i);         return(0);     }     else  /*若找到第i个结点，则删除并释放第i个结点*/     {         q=p->next;         p->next = p->next->next;         free(q);         return(1);     }  }   int loclItem(linklist *L, char *item) {     linklist *p;     int i;     p=L->next;     i=1;     while(p!=NULL)     {         if (strcmp(p->data.no,item)==0)         {            return i;         }         p=p->next;         i++;     }     return 0; }   int main() {     linklist  *L;     int i;     char item[10];     L=CreateList(3);     output(L);     printf("\n请输入你想要插入学生的位置\n");     scanf("%d", &i);     InsItem(L,i);     output(L);     printf("\n请输入你想删除的学生的位置\n");     scanf("%d", &i);     DelItem(L,i);     output(L);     printf("\n请输入你要查找的学生的位置\n");     scanf("%s", &item);     i=loclItem(L, item);     printf("你要查找的学生在第%d位", i);     return 0; }