鱼C论坛

 找回密码
 立即注册
查看: 1675|回复: 23

[已解决]程序要怎么改才能不报错?

[复制链接]
发表于 2018-10-11 14:13:51 | 显示全部楼层 |阅读模式

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

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

x
这是我写的有头单链表  结构体成员为字符类型的程序可以运行
但是我想改为 字符串的  我这样改怎么会报错的?帮我纠正下
最佳答案
2018-10-11 15:42:25
#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
        char a[20];
        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 ;
}
4.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-11 14:20:19 | 显示全部楼层
……与其截图,不如发代码……回复,工具栏右三
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 15:42:25 | 显示全部楼层    本楼为最佳答案   
#include<stdlib.h>
#include<string.h>
#include <stdio.h>
#include <malloc.h>

struct Book
{
        char a[20];
        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 ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 18:42:59 | 显示全部楼层

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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

上面可以,下面不可以,数组名就是地址了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 19:39:38 | 显示全部楼层
claws0n 发表于 2018-10-11 18:57
上面可以,下面不可以,数组名就是地址了

哦了  谢谢大佬点解 太爱你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 20:01:00 | 显示全部楼层
好像出问题了
123.png
321.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 20:01:40 | 显示全部楼层
claws0n 发表于 2018-10-11 18:57
上面可以,下面不可以,数组名就是地址了

出问题了 报错了 你看下我上图片了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[20];
        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 ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 21:11:46 | 显示全部楼层
本帖最后由 风骚的小胖子。 于 2018-10-11 21:13 编辑


struct Book *p3=xinlist(a);     // <--------  这句理解 因为参数是指针 传入指针;
strcpy(p2->a,a);  数组不能互相赋值只能cpy 参数为什么是数组和指针?  我感觉应该是(p2->a,(*a))对指针取值后为数组才可以啊  p2->a和a都不是同一性质 怎么互相cpy?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

函数声明是说明参数是什么样的数据类型,传进来之后,就直接用了,你多一个*是解引用~
解引用是字符,不是字符串。字符串特别,给首地址就好,认结束符~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 21:59:41 | 显示全部楼层
本帖最后由 风骚的小胖子。 于 2018-10-11 22:01 编辑
claws0n 发表于 2018-10-11 21:36
函数声明是说明参数是什么样的数据类型,传进来之后,就直接用了,你多一个*是解引用~
解引用是字符,不 ...


是不是这个意思     
char [a]="fishc";

strcpy(a,"IN");

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 22:01:48 | 显示全部楼层
风骚的小胖子。 发表于 2018-10-11 21:59
是不是这个意思     
char [a]="fishc";

嗯,虽然没有用过
char a[] = "fishc"; //这样好不好
但是 a[] = {'I','N','\0','h','c','\0'};
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

懂了太激动了 打错了哈哈。谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是懂了太激动了 打错了哈哈。 感觉大佬你好细心呀 还提醒我cpy的会复制数组后边的隐藏结束符。谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 22:20:44 | 显示全部楼层
厉害,厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 22:50:25 | 显示全部楼层

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

struct Book
{
        char a[20];
        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 ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[20];
        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 ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-11 23:04:37 | 显示全部楼层

看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-11 23:07:36 | 显示全部楼层

好吧,那我等版主大佬明天帮我解答。也谢谢你哦。晚安
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 13:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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