C++链表初始化失败

北风吹冷 2013-06-11 12:16:56

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode*next;
}LinkList;
typedef struct LNode LinkList;

void InitLinkList(LinkList *head)
{
(head)=(LinkList*)malloc(sizeof(LNode));
(head)->next=NULL;
(head)->data=0;
}
void Insert(LinkList *head,int data)
{
printf("开始建立节点:\n");
LNode*node=(LNode*)malloc(sizeof(LNode));
node->data=data;
node->next=NULL;
/*开始插入节点*/
printf("开始插入节点:\n");
LNode *p=head;
while(head->next!=NULL)
p=p->next;
p->next=node;
printf("插入节点完毕:");
}
int main()
{
LinkList *head=NULL;
InitLinkList(head);
for(int i=0;i<3;i++)
Insert(head,i);
}

我在InitLinklist函数中已经初始化了
head,但是在插入节点的时候,进入到了Insert函数后,head的data /next依然
是未定义的,没有初始化成功!
有些不解!
调试信息如下:

+ head 0x002b1540 {data=0 next=0x00000000 } LNode *
但是到了Insert函数执行时

+ head 0x002b14f8 {data=-842150451 next=0xcdcdcdcd } LNode *
就变成了这样
...全文
184 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
北风吹冷 2013-06-12
  • 打赏
  • 举报
回复
谢谢大家,我会结贴给分
www_adintr_com 2013-06-11
  • 打赏
  • 举报
回复
这个和 void f(int x); 里不能改变 x 的值是一样的. 你加一个 typedef LinkList* LinkListPtr; 然后你的函数定义就是 void InitLinkList(LinkListPtr head), 和 f 类似, 你不能改变 head 的值. 只能改变 head 指向的 LinkList 结构. 总之, 在函数参数里, 如果不是引用的话, 只有通过 (*xxx), xxx-> 方式改变的内容才会返回回去. 直接通过 xxx, xxx. 操作的内容是不会返回的.
北风吹冷 2013-06-11
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
void InitLinkList(LinkList *head) 这种参数只能改变 head 所指向的内容, 并不能改变 head 本身指向哪里. 你需要使用 void InitLinkList(LinkList**head) 才行.
能说的清楚一些吗?
hugett 2013-06-11
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
 typedef struct LNode{
	int data;
	struct LNode*next;
}LinkList;
typedef struct LNode LinkList;

void InitLinkList(LinkList **head)//这里改为LinkList**。。否则改变的只是head的副本。。不是head本身。。
{
	(*head)=(LinkList*)malloc(sizeof(LNode));
	(*head)->next=NULL;
	(*head)->data=0;
}
void Insert(LinkList *head,int data)
{
	printf("开始建立节点:\n");
	LNode*node=(LNode*)malloc(sizeof(LNode));
	node->data=data;
	node->next=NULL;
	/*开始插入节点*/
	printf("开始插入节点:\n");
	LNode *p=head;
	while(p->next!=NULL)//这里是p->next不是head->next。。
		p=p->next;
	p->next=node;
	printf("插入节点完毕:");
}
int main()
{
	LinkList *head=NULL;
	InitLinkList(&head);
	for(int i=0;i<3;i++)
		Insert(head,i);
}
北风吹冷 2013-06-11
  • 打赏
  • 举报
回复
初始化函数给为

void InitLinkList(LinkList **head)
{
	(*head)=(LinkList*)malloc(sizeof(LNode));
	(*head)->next=NULL;
	(*head)->data=0;
}
int main()
{
	LinkList  *head;
	InitLinkList(&head);
}
这样就可以啦,更加困惑了
www_adintr_com 2013-06-11
  • 打赏
  • 举报
回复
void InitLinkList(LinkList *head) 这种参数只能改变 head 所指向的内容, 并不能改变 head 本身指向哪里. 你需要使用 void InitLinkList(LinkList**head) 才行.
北风吹冷 2013-06-11
  • 打赏
  • 举报
回复
利用一如也可以操作

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
using namespace std;

 struct LNode 
{
	int data;
	LNode* next;
};

struct LinkList
{
	LNode* head;
};

void InitLinkList(LinkList& list)
{
	
	list.head = (LNode*)malloc(sizeof(LNode));
	list.head->data = 0;
	list.head->next = NULL;
}
 void Insert(LinkList& list,int data)
{
	printf("开始建立节点:\n");
	LNode* node=(LNode* )malloc(sizeof(LNode));
	node->data = data;
	node->next=NULL;

	/*开始插入节点*/
	printf("开始插入节点:\n");
	LNode *p = list.head;
	while(p->next != NULL)
	{
		p = p->next;
	}
	p->next=node;
	printf("插入节点完毕:\n");
}
void print(LinkList& list)
{
	printf("开始输出节点:\n");
	LNode *p = list.head->next;
	if(p==NULL)
		printf("链表是空的,无法输入!\n");
	while(p)
	{
		if(p->next!=NULL)
			printf("%d -->",p->data);
		else
			printf("%d ",p->data);
		p = p->next;
	}
	printf("输出节点完毕:\n");
}
int main()
{
	LinkList list;//局部内存空间已分配
	InitLinkList(list);
	cout<<list.head->data<<endl;
 	for(int i=0; i<3; i++)
 		Insert(list,i);
 	print(list);
	system("pause");
	return 0;
}


这是刚刚请教同学的

33,318

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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