风骚居士 发表于 2014-4-23 14:36:26

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

//本例生成单链表存储学号、名字、年龄;允许用户存入信息和通过学生学号检索学生的其他信息。
#include<stdio.h>
#include<stdlib.h>
#define op 90
typedef struct                               //定义存储的数据结构
{
        int number;
        char name;
        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;
}

rockerz 发表于 2014-4-23 21:31:22

问题都标注了,自己看下改下。#include<stdio.h>
#include<stdlib.h>
#define op 90
typedef struct                               //定义存储的数据结构
{
      int number;
      char name;
      int age;
      struct Node* next;
} Naode; //不要用node,和上面的node有冲突。我帮你把所有的node都改成Naode了
typedef Naode* linklist;
int main()
{
      int i,w;
      char q;
      linklist l,p,s,find;
      l=(linklist)malloc(sizeof(Naode));
      s=(linklist)malloc(sizeof(Naode));
      find=(linklist)malloc(sizeof(Naode));
      l->next=NULL;
      do                                                //这里开始是程序的主页面,设置了循环条件,用户选择退出才能离开程序
      {
      printf("请输入选择的操作类型:\n1、存入信息\n2、查找信息\n3、退出\n");
      q=getchar();
      switch(q)                                          //用户选择操作类型
          {
            case '1':
                  printf("请分别输入学号、名字、年龄并用逗号隔开\n");
                  p=(linklist)malloc(sizeof(Naode));
                  scanf("%d,%s,%d",&p->number,p->name,&p->age); // 语法:scanf("%d",&变量) ,要加&
                  p->next=l->next;
                  l->next=p->next; //类型不符:这边p是linklist型,l->next是struct *Node Next.所以才会错误。
                  printf("按下1显示所有信息记录,否则返回\n");
                  scanf("%d",&i);
                  if(i==1)
                  {
                        s->next=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;
}

风骚居士 发表于 2014-4-23 22:52:03

rockerz 发表于 2014-4-23 21:31 static/image/common/back.gif
问题都标注了,自己看下改下。

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

风骚居士 发表于 2014-4-23 22:53:15

还有想问问你怎么发帖的时候发代码时左边有每一行的数字

风骚居士 发表于 2014-4-23 22:53:51

还有想问问你怎么发帖的时候发代码时左边有每一行的数字

kangkaisen 发表于 2014-4-23 23:14:47

你这种编程风格很不好,不要把所有功能都集中在主函数里,每一个独立的功能尽量使用子函数

风骚居士 发表于 2014-4-24 07:19:36

kangkaisen 发表于 2014-4-23 23:14 static/image/common/back.gif
你这种编程风格很不好,不要把所有功能都集中在主函数里,每一个独立的功能尽量使用子函数

{:1_1:}   
我是新手,不太懂,下次多用子函数

rockerz 发表于 2014-4-24 20:53:30

发代码旁边有数字的原因是我用了 [ code]这个东西[ /code] 自己去掉空格。

我知道你的意思了。我也对C和C++也只能算是入门,刚开始可能是误解你的代码的意思。
一下是我改好的,已加新的备注。调试成功。你再看看吧#include<stdio.h>
#include<stdlib.h>
#define op 90
struct Node                           //这里不需要typedef。 看的懂英文可以参考下这个帖子http://stackoverflow.com/questions/18806392/typedef-struct-declarations,看不懂谷歌翻一下
{
      int number;
      char name;
      int age;
      struct Node* next;
};
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); //语法问题, &int变量
                  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;
}

rockerz 发表于 2014-4-24 22:08:58

我的用户组目前不能+好友或发信息。。。新鱼油的悲剧

风骚居士 发表于 2014-4-24 23:31:09

rockerz 发表于 2014-4-24 22:08 static/image/common/back.gif
我的用户组目前不能+好友或发信息。。。新鱼油的悲剧

加个qq吧{:1_1:}
我的q:499093256:lol:
页: [1]
查看完整版本: 求救,编译过了,连接出错