user-0 提问: c 语言链表问题，求大神解答

回复:
user: user-0
content: 引用 2 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include <string.h> #include<math.h>  //struct ticket    //后面的需要加typedef typedef struct ticket {     char nam[40];     //long int num[40];     long int num;     char depart[40];     char arrive[40];     char seat[40];     char money[40];     struct ticket *next; }TIC;  void landing() {     system("cls");     printf("\t\t\t火车票后台管理系统\t\t\t\n");     printf("=======*******1.增加学生信息********========");     printf("=======*******2.修改学生信息********========");     printf("=======*******3.删除学生信息********========");     printf("=======*******4.显示学生信息********========");     printf("=======*******5.保存学生信息********========");     printf("=======*******6.读取学生信息********========");     system("pause"); }  void select() {     int a;     system("cls");     printf("请输入数字，以便您选择:\n输入：");     scanf("%d",&a);     for(int i=0;i<=5;i++)     {         if(strcmp(a,i)==0)         {             switch(a)             {                 case 1: addup();                         break;                 case 2: amaned();                         break;                 case 3: Delete();                         break;                 case 4: show();                         break;                 case 5:save();                        break;                 case 6:read();                        break;             }         }         else {             printf("您输入的数字错误");             break;         }     }     system("pause");  }  //struct TIC *addup() TIC *addup() {     TIC *head,*p,*q;      head=(TIC*)malloc(sizeof(TIC));     head->next=NULL;     p=head;     q = (TIC*)malloc(sizeof(TIC));      setdata(q);      while((q->nam)>0)     {         p->next=q;         p=q;         q=(TIC*)malloc(sizeof(TIC));         setdata(q);     }     p->next=NULL;      return head }  void amaned(TIC *p) {     TIC *q;     int s;     long int a;      system("cls");     printf("输出关于需修改有关旅客信息的列车编号：");     scanf("%ld", &a);     for(p=head->next;p!=NULL;p=p->next)     {         //while(strcmp(p->num,a)==0)    //a 为long int类型，怎么能用strcmp比较呢？         //while(strcmp(p->num, a)==0)         while(p->num == a)         {             printf("旅客信息显示\n");             printf("乘客姓名：\t");             puts(p->nam);             printf("\n");             printf("列车编号：\t");             //printf("%ld\n",&p->num);             printf("%ld\n", p->num);             printf("起始站：\t");             puts(p->depart);             printf("终点站: \t");             puts(p->arrive);             printf("\n");             printf("座位号：\t");             puts(p->seat);             printf("\n");             printf("车票金额：\t");             puts(p->money);             //p = q;             q = p;             break;         }     }      printf("请选择：1.乘客姓名，2.列车编号,3.起始站,4.终点站，5.座位号，6.车票金额");      scanf("%d", &s);      if (s < 1 || s > 6) {         printf("您输入的数字错误");         return;     }      //if(s>=1&&s<=6)     //{     switch(s)     {         case 1:printf("输入乘客姓名：");                gets(q->nam);                break;          case 2:printf("输入列车编号：");                scanf("%ld",&q->num);                break;          case 3:printf("输入起始站：");                gets(q->depart);                break;          case 4:printf("输入终点站：");                gets(q->arrive);                break;          case 5:printf("输入座位号：");                gets(q->seat);                break;          case 6:printf("输入车票金额：");                gets(q->money);                break;     }      //}      //else     //   printf("您输入的数字错误");      system("pause"); }  void setdata() {      TIC *p;     printf("*******旅客信息增加*******\n\n");     printf("名字：\t");     gets(p->nam);     printf("\n");     printf("列车编号：\t");     //scanf("%ld\n",&p->num);    //看好自己定义的类型     scanf("%ld", p->num);     printf("起始站：\t");     gets(p->depart);     printf("终点站: \t");     gets(p->arrive);     printf("\n");     printf("座位号：\t");     gets(p->seat);     printf("\n");     printf("花费金额：\t");     gets(p->money); }  void Delete() {     TIC *head,*p,*q;     char i[10];      p = head;      printf("请输入待删旅客的名字：");     //scanf("%s",&i[10]);   //用法有问题     scanf("%s", i);      //while((p!=0)&&(p->nam!=i[10]))     //前面还知道用strcmp，这儿怎么突然直接比较呢？     while((p!= NULL)&&strcmp(p->nam, i) != 0)     {         q=p;         p=p->next;     }      if(p==NULL)         printf("该信息没有找到");     else     {         q->next=p->next;         free(p);     } }  void show(TIC *head) {     TIC *p;     p = head;      for(p=head->next;p!=NULL;p=p->next)     {         printf("旅客信息显示\n");         printf("乘客姓名：\t");         puts(p->nam);         printf("\n");         printf("列车编号：\t");         //printf("%ld\n",&p->num);    //printf是不是和scanf搞混了 ?         printf("%ld\n", p->num);         printf("起始站：\t");         puts(p->depart);         printf("终点站: \t");         puts(p->arrive);         printf("\n");         printf("座位号：\t");         puts(p->seat);         printf("\n");         printf("车票金额：\t");         puts(p->money);     }      system("pause");  }  #if 0 void save() {     FILE *fp;      //if((fp=fopen("c.txt","wb")==NULL);    //这儿的逗号做啥子？,是不是还缺少一个小括号?     if ((fp=fopen("c.txt","wb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fscanf(fp,"%s, %ld", landing, select)!=1)   //这是读2个参数为啥比较是否等于1呢？     //if(fscanf(fp,"%s, %ld", landing, select) != 2)     if(fscanf(fp, "%s, %ld", &landing, &select) != 2)  //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); }  void write() {      FILE *fp;     //if((fp=fopen("c.txt","rb")==NULL);    //还有这儿为啥用分号呢？     if((fp=fopen("c.txt","rb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fprintf(fp,"%s,%ld",&landing,&select)!=1)     //if(fprintf(fp,"%s,%ld",&landing,&select)!=2)     if(fprintf(fp,"%s,%ld", landing, select)!=2)    //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); } #endif  int main() {      TIC *head;     head=addup();     show(head);      return 0; }  楼主的问题不是链表问题，链表太高深，你的问题是基本的语言基础问题，错误太多，还有文件读写的操作没见过这么写的，我都修改不下去了。基础太差了，书上的东西没看仔细吧。 建议好好补补基础的东西，书上的习题和例题好好练练，模仿一下，不能自己想当然的去写。 好的好的，谢谢学长。因为我一个人看书，有时候理解不太到位

user: user-1
content: 大部分的错误已经修改，建议把剩下的错误再改改，读写文件的部分再翻开书看看

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include <string.h> #include<math.h>  //struct ticket    //后面的需要加typedef typedef struct ticket {     char nam[40];     //long int num[40];     long int num;     char depart[40];     char arrive[40];     char seat[40];     char money[40];     struct ticket *next; }TIC;  void landing() {     system("cls");     printf("\t\t\t火车票后台管理系统\t\t\t\n");     printf("=======*******1.增加学生信息********========");     printf("=======*******2.修改学生信息********========");     printf("=======*******3.删除学生信息********========");     printf("=======*******4.显示学生信息********========");     printf("=======*******5.保存学生信息********========");     printf("=======*******6.读取学生信息********========");     system("pause"); }  void select() {     int a;     system("cls");     printf("请输入数字，以便您选择:\n输入：");     scanf("%d",&a);     for(int i=0;i<=5;i++)     {         if(strcmp(a,i)==0)         {             switch(a)             {                 case 1: addup();                         break;                 case 2: amaned();                         break;                 case 3: Delete();                         break;                 case 4: show();                         break;                 case 5:save();                        break;                 case 6:read();                        break;             }         }         else {             printf("您输入的数字错误");             break;         }     }     system("pause");  }  //struct TIC *addup() TIC *addup() {     TIC *head,*p,*q;      head=(TIC*)malloc(sizeof(TIC));     head->next=NULL;     p=head;     q = (TIC*)malloc(sizeof(TIC));      setdata(q);      while((q->nam)>0)     {         p->next=q;         p=q;         q=(TIC*)malloc(sizeof(TIC));         setdata(q);     }     p->next=NULL;      return head }  void amaned(TIC *p) {     TIC *q;     int s;     long int a;      system("cls");     printf("输出关于需修改有关旅客信息的列车编号：");     scanf("%ld", &a);     for(p=head->next;p!=NULL;p=p->next)     {         //while(strcmp(p->num,a)==0)    //a 为long int类型，怎么能用strcmp比较呢？         //while(strcmp(p->num, a)==0)         while(p->num == a)         {             printf("旅客信息显示\n");             printf("乘客姓名：\t");             puts(p->nam);             printf("\n");             printf("列车编号：\t");             //printf("%ld\n",&p->num);             printf("%ld\n", p->num);             printf("起始站：\t");             puts(p->depart);             printf("终点站: \t");             puts(p->arrive);             printf("\n");             printf("座位号：\t");             puts(p->seat);             printf("\n");             printf("车票金额：\t");             puts(p->money);             //p = q;             q = p;             break;         }     }      printf("请选择：1.乘客姓名，2.列车编号,3.起始站,4.终点站，5.座位号，6.车票金额");      scanf("%d", &s);      if (s < 1 || s > 6) {         printf("您输入的数字错误");         return;     }      //if(s>=1&&s<=6)     //{     switch(s)     {         case 1:printf("输入乘客姓名：");                gets(q->nam);                break;          case 2:printf("输入列车编号：");                scanf("%ld",&q->num);                break;          case 3:printf("输入起始站：");                gets(q->depart);                break;          case 4:printf("输入终点站：");                gets(q->arrive);                break;          case 5:printf("输入座位号：");                gets(q->seat);                break;          case 6:printf("输入车票金额：");                gets(q->money);                break;     }      //}      //else     //   printf("您输入的数字错误");      system("pause"); }  void setdata() {      TIC *p;     printf("*******旅客信息增加*******\n\n");     printf("名字：\t");     gets(p->nam);     printf("\n");     printf("列车编号：\t");     //scanf("%ld\n",&p->num);    //看好自己定义的类型     scanf("%ld", p->num);     printf("起始站：\t");     gets(p->depart);     printf("终点站: \t");     gets(p->arrive);     printf("\n");     printf("座位号：\t");     gets(p->seat);     printf("\n");     printf("花费金额：\t");     gets(p->money); }  void Delete() {     TIC *head,*p,*q;     char i[10];      p = head;      printf("请输入待删旅客的名字：");     //scanf("%s",&i[10]);   //用法有问题     scanf("%s", i);      //while((p!=0)&&(p->nam!=i[10]))     //前面还知道用strcmp，这儿怎么突然直接比较呢？     while((p!= NULL)&&strcmp(p->nam, i) != 0)     {         q=p;         p=p->next;     }      if(p==NULL)         printf("该信息没有找到");     else     {         q->next=p->next;         free(p);     } }  void show(TIC *head) {     TIC *p;     p = head;      for(p=head->next;p!=NULL;p=p->next)     {         printf("旅客信息显示\n");         printf("乘客姓名：\t");         puts(p->nam);         printf("\n");         printf("列车编号：\t");         //printf("%ld\n",&p->num);    //printf是不是和scanf搞混了 ?         printf("%ld\n", p->num);         printf("起始站：\t");         puts(p->depart);         printf("终点站: \t");         puts(p->arrive);         printf("\n");         printf("座位号：\t");         puts(p->seat);         printf("\n");         printf("车票金额：\t");         puts(p->money);     }      system("pause");  }  #if 0 void save() {     FILE *fp;      //if((fp=fopen("c.txt","wb")==NULL);    //这儿的逗号做啥子？,是不是还缺少一个小括号?     if ((fp=fopen("c.txt","wb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fscanf(fp,"%s, %ld", landing, select)!=1)   //这是读2个参数为啥比较是否等于1呢？     //if(fscanf(fp,"%s, %ld", landing, select) != 2)     if(fscanf(fp, "%s, %ld", &landing, &select) != 2)  //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); }  void write() {      FILE *fp;     //if((fp=fopen("c.txt","rb")==NULL);    //还有这儿为啥用分号呢？     if((fp=fopen("c.txt","rb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fprintf(fp,"%s,%ld",&landing,&select)!=1)     //if(fprintf(fp,"%s,%ld",&landing,&select)!=2)     if(fprintf(fp,"%s,%ld", landing, select)!=2)    //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); } #endif  int main() {      TIC *head;     head=addup();     show(head);      return 0; }  楼主的问题不是链表问题，链表太高深，你的问题是基本的语言基础问题，错误太多，还有文件读写的操作没见过这么写的，我都修改不下去了。基础太差了，书上的东西没看仔细吧。 建议好好补补基础的东西，书上的习题和例题好好练练，模仿一下，不能自己想当然的去写。

user: user-2
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633