segmentation fault :11错误

Lyp_student 2018-01-28 05:34:35
是用mac写的,然后利用终端执行,调试了很久,问题在Inser_list函数的if下,但是不知道怎么解决啊!!
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{ int data;
struct node *next;

}linklist;
void Insert_list(linklist *rear,int entag)//利用尾插法插入元素。
{
int val;
//int x =0;
//linklist *rear=L;
printf("准备赋值");
scanf("%d",&val);
if(val==entag)
rear =NULL;
//printf("完成");
//{rear = (linklist*)malloc(sizeof(linklist));rear->next=NULL;rear->data=45;printf("完成");}
else
{
rear = (linklist*)malloc(sizeof(linklist));
rear->data = val;
printf("\n————————————完成————————————\n");
Insert_list(rear->next,entag);

}
}
void init_list(linklist *head)
{
head = (linklist*)malloc(sizeof(linklist));
head->next = NULL;
printf("\n初始化完成\n");
}

void print_list(linklist *head)
{ linklist *p=head->next;
printf("准备输出:");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("链表为空");
}

int main()
{ linklist *L;

printf("创建成功");
L = (linklist*)malloc(sizeof(linklist));
linklist *rear = L;
init_list(L);
Insert_list(rear,4);
print_list(L);

return 0;}
...全文
1490 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jena_wy 2018-01-29
  • 打赏
  • 举报
回复
scanf("%d",&data);包含回车符。
Lyp_student 2018-01-28
  • 打赏
  • 举报
回复
引用 5 楼 super_admi的回复:
你这个不是最后指针为空的问题。最后的指针为空是对的。你这里主要是参数的问题,你没理解参数是怎么传递的。 按照你的想法,我把代码做了些优化:

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

typedef struct tagNode
{
    int             data;
	struct tagNode* next;
}Node;

Node* getNode(int data)
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    return (node);
}

void append(Node* last)
{
	int data = 0;
	printf("准备赋值:");
	scanf("%d",&data);
	if(data > 0)
	{
	    last->next = getNode(data);
	    append(last->next);
	}
}

void display(Node *head)
{
    Node* node = head;
    int data = 0;
	printf("准备输出:\n");
	while(NULL != node)
    {
        printf("data: %d\n", (data = node->data, node = node->next, data));
    }
}

void destroy(Node* head)
{
    Node* node = head;
    int data = 0;
	printf("准备释放:\n");
	while(NULL != node)
    {
        printf("free: %d\n", (data = node->data, head = head->next, free(node), node= head, data));
    }
}

int main()
{
    Node *head = getNode(-1);
	append(head);
	display(head);
	destroy(head);
	return (0);
}
好的,谢谢,我再研究一下
super_admi 2018-01-28
  • 打赏
  • 举报
回复
你这个不是最后指针为空的问题。最后的指针为空是对的。你这里主要是参数的问题,你没理解参数是怎么传递的。 按照你的想法,我把代码做了些优化:

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

typedef struct tagNode
{
    int             data;
	struct tagNode* next;
}Node;

Node* getNode(int data)
{
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    return (node);
}

void append(Node* last)
{
	int data = 0;
	printf("准备赋值:");
	scanf("%d",&data);
	if(data > 0)
	{
	    last->next = getNode(data);
	    append(last->next);
	}
}

void display(Node *head)
{
    Node* node = head;
    int data = 0;
	printf("准备输出:\n");
	while(NULL != node)
    {
        printf("data: %d\n", (data = node->data, node = node->next, data));
    }
}

void destroy(Node* head)
{
    Node* node = head;
    int data = 0;
	printf("准备释放:\n");
	while(NULL != node)
    {
        printf("free: %d\n", (data = node->data, head = head->next, free(node), node= head, data));
    }
}

int main()
{
    Node *head = getNode(-1);
	append(head);
	display(head);
	destroy(head);
	return (0);
}
Lyp_student 2018-01-28
  • 打赏
  • 举报
回复
引用 3 楼 super_admi的回复:

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{	int data;
	struct node *next;

}linklist;
void Insert_list(linklist **rear,int entag)//利用尾插法插入元素。
{
	int val;
	//int x =0;
	//linklist *rear=L;
	printf("准备赋值");
	scanf("%d",&val);
	if(val==entag)
		(*rear) =NULL;
		//printf("完成");
		//{rear = (linklist*)malloc(sizeof(linklist));rear->next=NULL;rear->data=45;printf("完成");}
	else
	{
		(*rear) = (linklist*)malloc(sizeof(linklist));
		(*rear)->data = val;
		printf("\n————————————完成————————————\n");
		Insert_list(&((*rear)->next),entag);

	}
}
void init_list(linklist **head)
{
	(*head) = (linklist*)malloc(sizeof(linklist));
	(*head)->next = NULL;
	printf("\n初始化完成\n");
}

void print_list(linklist *head)
{	linklist *p=head->next;
	printf("准备输出:\n");
	while(p!=NULL)
	{
		printf("%d\n",p->data);
		p=p->next;
	}
printf("链表为空");
}

int main()
{	linklist *L;

	printf("创建成功");
	//L = (linklist*)malloc(sizeof(linklist));
	//linklist *rear = L;
	init_list(&L);
	Insert_list(&(L->next),4);
	print_list(L);

return 0;}
那为什么之前写法不行呢,链表最后指针为空不也应该可以吗?
super_admi 2018-01-28
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{	int data;
	struct node *next;

}linklist;
void Insert_list(linklist **rear,int entag)//利用尾插法插入元素。
{
	int val;
	//int x =0;
	//linklist *rear=L;
	printf("准备赋值");
	scanf("%d",&val);
	if(val==entag)
		(*rear) =NULL;
		//printf("完成");
		//{rear = (linklist*)malloc(sizeof(linklist));rear->next=NULL;rear->data=45;printf("完成");}
	else
	{
		(*rear) = (linklist*)malloc(sizeof(linklist));
		(*rear)->data = val;
		printf("\n————————————完成————————————\n");
		Insert_list(&((*rear)->next),entag);

	}
}
void init_list(linklist **head)
{
	(*head) = (linklist*)malloc(sizeof(linklist));
	(*head)->next = NULL;
	printf("\n初始化完成\n");
}

void print_list(linklist *head)
{	linklist *p=head->next;
	printf("准备输出:\n");
	while(p!=NULL)
	{
		printf("%d\n",p->data);
		p=p->next;
	}
printf("链表为空");
}

int main()
{	linklist *L;

	printf("创建成功");
	//L = (linklist*)malloc(sizeof(linklist));
	//linklist *rear = L;
	init_list(&L);
	Insert_list(&(L->next),4);
	print_list(L);

return 0;}
Lyp_student 2018-01-28
  • 打赏
  • 举报
回复
引用 1 楼 super_admi的回复:
大坑!!!!!
什么意思啊!
super_admi 2018-01-28
  • 打赏
  • 举报
回复
大坑!!!!!

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧