风骚的小胖子。 发表于 2018-10-11 14:13:51

程序要怎么改才能不报错?

这是我写的有头单链表结构体成员为字符类型的程序可以运行
但是我想改为 字符串的我这样改怎么会报错的?帮我纠正下

claws0n 发表于 2018-10-11 14:20:19

……与其截图,不如发代码……回复,工具栏右三

贫蛋小刺朗 发表于 2018-10-11 15:42:25

#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
        char a;
        struct Book *next;
};

struct Book *list()
{
        struct Book *p1=(struct Book *)malloc(sizeof(struct Book));
        p1->next=NULL;
        return p1;

}
//传参char a[]非char a
struct Book *xinlist(char a[])
{
        struct Book *p2=(struct Book *)malloc(sizeof(struct Book));
//        p2->a=a; 数组之间不能直接赋值,需要通过strcpy或者逐个字符赋值。
        strcpy(p2->a,a);
        p2->next=NULL;
        return p2;
}

void lianjie(struct Book *p1,char a[])
{
        struct Book *p3=xinlist(a);
        p3->next=p1->next;
        p1->next=p3;
}

void dayin(struct Book *p1)
{
        struct Book *p4=p1->next;
        while(p4!=NULL)
        {
                printf("%s",p4->a);
                p4=p4->next;
        }

}

int main(void)
{
        struct Book *p=list();
        lianjie(p,"带你飞");
        lianjie(p,"阿斯打");
        lianjie(p,"阿斯打算");
        dayin(p);
        return 0 ;
}

风骚的小胖子。 发表于 2018-10-11 18:42:59

贫蛋小刺朗 发表于 2018-10-11 15:42


struct Book *xinlist(char *a)//改成数组的地址可以吗?假如可以的话下边strcpy里的参数对不对。主函数输入的参数还需要改吗?
{
      struct Book *p2=(struct Book *)malloc(sizeof(struct Book));
//      p2->a=a; 数组之间不能直接赋值,需要通过strcpy或者逐个字符赋值。
      strcpy(p2->a,(*a));
      p2->next=NULL;
      return p2;

claws0n 发表于 2018-10-11 18:57:06

风骚的小胖子。 发表于 2018-10-11 18:42
struct Book *xinlist(char *a)//改成数组的地址可以吗?假如可以的话下边strcpy里的参数对不对。主函 ...

上面可以,下面不可以,数组名就是地址了

风骚的小胖子。 发表于 2018-10-11 19:39:38

claws0n 发表于 2018-10-11 18:57
上面可以,下面不可以,数组名就是地址了

哦了谢谢大佬点解 太爱你了{:5_101:}

风骚的小胖子。 发表于 2018-10-11 20:01:00

好像出问题了

风骚的小胖子。 发表于 2018-10-11 20:01:40

claws0n 发表于 2018-10-11 18:57
上面可以,下面不可以,数组名就是地址了

出问题了 报错了 你看下我上图片了

claws0n 发表于 2018-10-11 20:13:06

风骚的小胖子。 发表于 2018-10-11 20:01
出问题了 报错了 你看下我上图片了

发代码比较好#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
      char a;
      struct Book *next;
};

struct Book *list()
{
      struct Book *p1=(struct Book *)malloc(sizeof(struct Book));
      p1->next=NULL;
      return p1;

}

struct Book *xinlist(char *a)
{
      struct Book *p2=(struct Book *)malloc(sizeof(struct Book));
//      p2->a=a;
      strcpy(p2->a,a);
      p2->next=NULL;
      return p2;
}

void lianjie(struct Book *p1,char *a)
{
      struct Book *p3=xinlist(a);   // <--------
      p3->next=p1->next;
      p1->next=p3;
}

void dayin(struct Book *p1)
{
      struct Book *p4=p1->next;
      while(p4!=NULL)
      {
                printf("%s",p4->a);
                p4=p4->next;
      }

}

int main(void)
{
      struct Book *p=list();
      lianjie(p,"ABC");
      lianjie(p,"DEF");
      lianjie(p,"GHI");
      dayin(p);
      return 0 ;
}

风骚的小胖子。 发表于 2018-10-11 21:11:46

本帖最后由 风骚的小胖子。 于 2018-10-11 21:13 编辑

claws0n 发表于 2018-10-11 20:13
发代码比较好

struct Book *p3=xinlist(a);   // <--------这句理解 因为参数是指针 传入指针;
strcpy(p2->a,a);数组不能互相赋值只能cpy 参数为什么是数组和指针?我感觉应该是(p2->a,(*a))对指针取值后为数组才可以啊p2->a和a都不是同一性质 怎么互相cpy?

claws0n 发表于 2018-10-11 21:36:30

风骚的小胖子。 发表于 2018-10-11 21:11
struct Book *p3=xinlist(a);   // a,a);数组不能互相赋值只能cpy 参数为什么是数组和指针?我感 ...

函数声明是说明参数是什么样的数据类型,传进来之后,就直接用了,你多一个*是解引用~
解引用是字符,不是字符串。字符串特别,给首地址就好,认结束符~

风骚的小胖子。 发表于 2018-10-11 21:59:41

本帖最后由 风骚的小胖子。 于 2018-10-11 22:01 编辑

claws0n 发表于 2018-10-11 21:36
函数声明是说明参数是什么样的数据类型,传进来之后,就直接用了,你多一个*是解引用~
解引用是字符,不 ...

是不是这个意思   
char ="fishc";

strcpy(a,"IN");

a字符串数组里就是IN了呗?

我刚才理解为那个指针为指向数组的指针了。然后解引用变为数组。然后数组之间再cpy

claws0n 发表于 2018-10-11 22:01:48

风骚的小胖子。 发表于 2018-10-11 21:59
是不是这个意思   
char ="fishc";



嗯,虽然没有用过{:10_282:}
char a[] = "fishc"; //这样好不好
但是 a[] = {'I','N','\0','h','c','\0'};

风骚的小胖子。 发表于 2018-10-11 22:04:02

claws0n 发表于 2018-10-11 22:01
嗯,虽然没有用过
char a[] = "fishc"; //这样好不好
但是 a[] = {'I','N','\0','h','c','\0 ...

懂了太激动了 打错了哈哈。谢谢大佬

风骚的小胖子。 发表于 2018-10-11 22:06:37

claws0n 发表于 2018-10-11 22:01
嗯,虽然没有用过
char a[] = "fishc"; //这样好不好
但是 a[] = {'I','N','\0','h','c','\0 ...

是懂了太激动了 打错了哈哈。 感觉大佬你好细心呀 还提醒我cpy的会复制数组后边的隐藏结束符。谢谢啦

第五 发表于 2018-10-11 22:20:44

厉害,厉害{:5_108:}

风骚的小胖子。 发表于 2018-10-11 22:50:25

第五 发表于 2018-10-11 22:20
厉害,厉害

#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
      char a;
      struct Book *next;
};

struct Book *list()
{
      struct Book *p1=(struct Book *)malloc(sizeof(struct Book));
      p1->next=NULL;
      return p1;

}

struct Book *xinlist(char *a)
{
      struct Book *p2=(struct Book *)malloc(sizeof(struct Book));
//      p2->a=a;
      strcpy(p2->a,a);
      p2->next=NULL;
      return p2;
}

void lianjie(struct Book *p1,char *a)
{
      struct Book *p3=xinlist(a);   // <--------
      static struct Book *p4;
      p4->next=p3;
      p3->next=NULL;       <--------改为尾插法为什么会报段错误昵?
      p4=p3;      
// p3->next=p1->next;
      //p1->next=p3;
}

void dayin(struct Book *p1)
{
      struct Book *p4=p1->next;
      while(p4!=NULL)
      {
                printf("%s",p4->a);
                p4=p4->next;
      }

}

int main(void)
{
      struct Book *p=list();
      lianjie(p,"ABC");
      lianjie(p,"DEF");
      lianjie(p,"GHI");
      dayin(p);
      return 0 ;

风骚的小胖子。 发表于 2018-10-11 22:51:10

claws0n 发表于 2018-10-11 22:01
嗯,虽然没有用过
char a[] = "fishc"; //这样好不好
但是 a[] = {'I','N','\0','h','c','\0 ...

#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
      char a;
      struct Book *next;
};

struct Book *list()
{
      struct Book *p1=(struct Book *)malloc(sizeof(struct Book));
      p1->next=NULL;
      return p1;

}

struct Book *xinlist(char *a)
{
      struct Book *p2=(struct Book *)malloc(sizeof(struct Book));
//      p2->a=a;
      strcpy(p2->a,a);
      p2->next=NULL;
      return p2;
}

void lianjie(struct Book *p1,char *a)
{
      struct Book *p3=xinlist(a);   // <--------
      static struct Book *p4;
      p4->next=p3;
      p3->next=NULL;       <--------改为尾插法为什么会报段错误昵?
      p4=p3;      
// p3->next=p1->next;
      //p1->next=p3;
}

void dayin(struct Book *p1)
{
      struct Book *p4=p1->next;
      while(p4!=NULL)
      {
                printf("%s",p4->a);
                p4=p4->next;
      }

}

int main(void)
{
      struct Book *p=list();
      lianjie(p,"ABC");
      lianjie(p,"DEF");
      lianjie(p,"GHI");
      dayin(p);
      return 0 ;

第五 发表于 2018-10-11 23:04:37

风骚的小胖子。 发表于 2018-10-11 22:50
#include
#include
#include


看不懂啊

风骚的小胖子。 发表于 2018-10-11 23:07:36

第五 发表于 2018-10-11 23:04
看不懂啊

好吧,那我等版主大佬明天帮我解答。也谢谢你哦。晚安
页: [1] 2
查看完整版本: 程序要怎么改才能不报错?