鱼C论坛

 找回密码
 立即注册
查看: 2769|回复: 9

求救,编译过了,连接出错

[复制链接]
发表于 2014-4-23 14:36:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//本例生成单链表存储学号、名字、年龄;允许用户存入信息和通过学生学号检索学生的其他信息。
#include<stdio.h>
#include<stdlib.h>
#define op 90
typedef struct                               //定义存储的数据结构
{
        int number;
        char name[op];
        int age;
        struct Node* next;
}Node;
typedef Node* linklist;
int main()
{
        int i,w;
        char q;
        linklist l,p,s,find;
        l=(linklist)malloc(sizeof(Node));
        s=(linklist)malloc(sizeof(Node));
        find=(linklist)malloc(sizeof(Node));
        l->next=NULL;
        do                                                  //这里开始是程序的主页面,设置了循环条件,用户选择退出才能离开程序
        {
        printf("请输入选择的操作类型:\n1、存入信息\n2、查找信息\n3、退出\n");
        q=getchar();
        switch(q)                                            //用户选择操作类型
          {
            case '1':
                  printf("请分别输入学号、名字、年龄并用逗号隔开\n");
                  p=(linklist)malloc(sizeof(Node));
                  scanf("%d,%s,%d",p->number,p->name,p->age);
                  p->next=l->next;
                  l->next=p;
                  printf("按下1显示所有信息记录,否则返回\n");
                  scanf("%d",&i);
                  if(i==1)
                  {
                        s=l->next;
                        while(i==1&&!(s->next==NULL))
                        {
                                printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);
                                s-s->next;
                        }
                        printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);

                  }  //if
                  i=0;
                  break;
            case '2':
                  find=l;
                  printf("请输入学号\n");
                  scanf("%d",s->number);
                  while(s->number!=find->number)
                  {
                        find=find->next;
                  }
                  if(s->number!=find->number) return -1;
                  else
                   printf("学号:%d,名字:%s,年龄:%d\n",find->number,find->name,find->age);
                  break;
            default:break;
          }         //switch
        printf("继续操作请按下1\n否则退出程序\n");
        scanf("%d",&w);
        }while(w==1);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-23 21:31:22 | 显示全部楼层
问题都标注了,自己看下改下。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define op 90
  4. typedef struct                               //定义存储的数据结构
  5. {
  6.         int number;
  7.         char name[op];
  8.         int age;
  9.         struct Node* next;
  10. } Naode; //不要用node,和上面的node有冲突。我帮你把所有的node都改成Naode了
  11. typedef Naode* linklist;
  12. int main()
  13. {
  14.         int i,w;
  15.         char q;
  16.         linklist l,p,s,find;
  17.         l=(linklist)malloc(sizeof(Naode));
  18.         s=(linklist)malloc(sizeof(Naode));
  19.         find=(linklist)malloc(sizeof(Naode));
  20.         l->next=NULL;
  21.         do                                                  //这里开始是程序的主页面,设置了循环条件,用户选择退出才能离开程序
  22.         {
  23.         printf("请输入选择的操作类型:\n1、存入信息\n2、查找信息\n3、退出\n");
  24.         q=getchar();
  25.         switch(q)                                            //用户选择操作类型
  26.           {
  27.             case '1':
  28.                   printf("请分别输入学号、名字、年龄并用逗号隔开\n");
  29.                   p=(linklist)malloc(sizeof(Naode));
  30.                   scanf("%d,%s,%d",&p->number,p->name,&p->age); // 语法:scanf("%d",&变量) ,要加&
  31.                   p->next=l->next;
  32.                   l->next=p->next; //类型不符:这边p是linklist型,l->next是struct *Node Next.所以才会错误。
  33.                   printf("按下1显示所有信息记录,否则返回\n");
  34.                   scanf("%d",&i);
  35.                   if(i==1)
  36.                   {
  37.                         s->next=l->next;  //类型不符:和上面一样
  38.                         while(i==1&&!(s->next==NULL))
  39.                         {
  40.                                 printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);
  41.                                 s-s->next; //你这是要干什么??
  42.                         }
  43.                         printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);

  44.                   }  //if
  45.                   i=0;
  46.                   break;
  47.             case '2':
  48.                   find=l;
  49.                   printf("请输入学号\n");
  50.                   scanf("%d",&s->number); //语法:看上面
  51.                   while(s->number!=find->number)
  52.                   {
  53.                         find=find->next; //类型不符:看上面
  54.                   }
  55.                   if(s->number!=find->number) return -1;
  56.                   else
  57.                    printf("学号:%d,名字:%s,年龄:%d\n",find->number,find->name,find->age);
  58.                   break;
  59.             default:break;
  60.           }         //switch
  61.         printf("继续操作请按下1\n否则退出程序\n");
  62.         scanf("%d",&w);
  63.         }while(w==1);
  64.         return 0;
  65. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-23 22:52:03 | 显示全部楼层

谢谢你!:handshake:handshake
感谢你看了这么久。
我还是有些不明白,想请教你。
关键是32行,你说p是linklist类型,而l->next是struct *Node Next类型,这是出错的原因。
朋友,其实我想要的效果是p和l->next同样类型。我想定义的结构是链表,也就是说我本来想定义next为指向这个结构体本身的指针。而你把原本Node全部换为了Naode,所以后来就类型不相对
然后现在就是想问你,我要定义一个结构体,结构体里面定义一个指向这个结构体本身的指针,我要怎么定义?类似于单链表,定义一个节点,里面包含数据和指针域。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-23 22:53:15 | 显示全部楼层
还有想问问你  怎么发帖的时候发代码时左边有每一行的数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-23 22:53:51 | 显示全部楼层
还有想问问你  怎么发帖的时候发代码时左边有每一行的数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-23 23:14:47 | 显示全部楼层
你这种编程风格很不好,不要把所有功能都集中在主函数里,每一个独立的功能尽量使用子函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-24 07:19:36 | 显示全部楼层
kangkaisen 发表于 2014-4-23 23:14
你这种编程风格很不好,不要把所有功能都集中在主函数里,每一个独立的功能尽量使用子函数

{:1_1:}     
我是新手,不太懂,下次多用子函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-24 20:53:30 | 显示全部楼层
发代码旁边有数字的原因是我用了 [ code]这个东西[ /code] 自己去掉空格。

我知道你的意思了。我也对C和C++也只能算是入门,刚开始可能是误解你的代码的意思。
一下是我改好的,已加新的备注。调试成功。你再看看吧
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define op 90
  4. struct Node                             //这里不需要typedef。 看的懂英文可以参考下这个帖子http://stackoverflow.com/questions/18806392/typedef-struct-declarations,看不懂谷歌翻一下
  5. {
  6.         int number;
  7.         char name[op];
  8.         int age;
  9.         struct Node* next;
  10. };
  11. typedef Node* linklist;
  12. int main()
  13. {
  14.         int i,w;
  15.         char q;
  16.         linklist l,p,s,find;
  17.         l=(linklist)malloc(sizeof(Node));
  18.         s=(linklist)malloc(sizeof(Node));
  19.         find=(linklist)malloc(sizeof(Node));
  20.         l->next=NULL;
  21.         do                                                  //这里开始是程序的主页面,设置了循环条件,用户选择退出才能离开程序
  22.         {
  23.         printf("请输入选择的操作类型:\n1、存入信息\n2、查找信息\n3、退出\n");
  24.         q=getchar();
  25.         switch(q)                                            //用户选择操作类型
  26.           {
  27.             case '1':
  28.                   printf("请分别输入学号、名字、年龄并用逗号隔开\n");
  29.                   p=(linklist)malloc(sizeof(Node));
  30.                   scanf("%d,%s,%d",&p->number,p->name,&p->age); //语法问题, &int变量
  31.                   p->next=l->next;
  32.                   l->next=p;
  33.                   printf("按下1显示所有信息记录,否则返回\n");
  34.                   scanf("%d",&i);
  35.                   if(i==1)
  36.                   {
  37.                         s=l->next;
  38.                         while(i==1&&!(s->next==NULL))
  39.                         {
  40.                                 printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);
  41.                                 s=s->next; //估计是粗心。我猜应该是这样
  42.                         }
  43.                         printf("学号:%d,名字:%s,年龄:%d\n",s->number,s->name,s->age);

  44.                   }  //if
  45.                   i=0;
  46.                   break;
  47.             case '2':
  48.                   find=l;
  49.                   printf("请输入学号\n");
  50.                   scanf("%d",&s->number);   // 语法问题,看上面
  51.                   while(s->number!=find->number)
  52.                   {
  53.                         find=find->next;
  54.                   }
  55.                   if(s->number!=find->number) return -1;
  56.                   else
  57.                    printf("学号:%d,名字:%s,年龄:%d\n",find->number,find->name,find->age);
  58.                   break;
  59.             default:break;
  60.           }         //switch
  61.         printf("继续操作请按下1\n否则退出程序\n");
  62.         scanf("%d",&w);
  63.         }while(w==1);
  64.         return 0;
  65. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-24 22:08:58 | 显示全部楼层
我的用户组目前不能+好友或发信息。。。新鱼油的悲剧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-24 23:31:09 | 显示全部楼层
rockerz 发表于 2014-4-24 22:08
我的用户组目前不能+好友或发信息。。。新鱼油的悲剧

加个qq吧{:1_1:}  
我的q:499093256:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表