链表初始化(链表初始化为什么要新生成结点)
本篇文章给大家谈谈链表初始化,以及链表初始化为什么要新生成结点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、C++中链表初始化
- 2、链表的初始化
- 3、链表初始化的问题,指针问题。
- 4、怎样定义单链表,并初始化
- 5、关于单链表初始化的问题
C++中链表初始化
p1=p2=(Cwow *)malloc(sizeof(Cwow));
问题出在这一句,这里只是负责分配一个空间大小瞎好宴sizeof(Cwow)的堆内存给p1.这块内存的数据是没有经过初袜橘始化的。
所以当你调用p1-name时就会报错,因为string name的内容是随机的。
解决办法有两个:
使用new操作符, p1 = p2 = new Cwow;
在p1=p2=(Cwow *)malloc(sizeof(Cwow));后磨银面增加一句,memset(p1, 0 ,sizeof(Cwow));
建议使用第一种方法,使用new操作符,会自动调用string的默认构造函数。
链表的初始化
应该加上pTemp-age=0;
malloc()时,内存中的数正岁据卜清枣是随机的,需要明确进行成员型拆变量初始化!
链表初始化的问题,指针问题。
最近学习链表栈队列时候,发现逻辑上来说这几个问题是很容易就搞明白的,但是具体实现尤其是用C语言实现,这个指针参数的传入,有很大的问题,还牵扯到malloc函数的亮模调用的用法,我来一一总结一下。
关于栈链初始化,我们一般来说用以下方法。
typedef struct SNode *Stack;
typedef struct SNode{
ElementType Data;
Stack Next;
};
Stack InitStack(){
Stack S = (Stack)malloc(sizeof(struct SNode));
S-Next=NULL;
return S;
}
我们先定义了一个SNode的结构体,是节点,然后我们定义了Stack 是一个指针变量指向了SNode,实际上它就是链表的最开始的头指针,然后我们进行初始化,定义头节点指针为S,这时候我们注意,Stack是一个指针型变量,指向的是结构体,因此,malloc分配函数直接进行强制转化 左边括号就是Stack, 转化成了一种指针类型,我们顺便复习一下malloc的用法,malloc函数分配就是动态的分配内存,右边括号是计算出需要用的字节数,也即是我们申请存放变量的类型字节数,前面的括号里的即是要转化成的指针类型,是属于一种强制类型转化。最后我们定义S的下一个节点是空,这样就可以完成初始化了形成一个空栈。
值得一提的是,malloc申请分配完的内存在使用完毕后需要free,将其释放。
再例如以下初始化。
typedef struct Node
{
StackElementType data;
struct node *next;
} LinkStackNode;
typedef LinkStackNode *LinkStack;
void initStack(LinkStack *L)
{
*L=(LinkStack)malloc(sizeof(Node))
(*L)-next=NULL;
}
这种初始化和上面那种初始化实际上是一样的,虽然看起来有较大差异,同样的,我们定义了一个Node节点的结构体,然后LinkStack是一个指向结构敬正缓体的指针,我们初始化的参数是一个指向指针的指针L,因此在初始化过程清渗中我们用的是*L,这里的*L是指向头节点的指针变量也即使前一种方法里面的Stack。
我们一定要分清楚,前者是不用二重指针的,因为它有了返回值,而后者需要用二重指针,原因就在于我们需要改变一重指针的下一个节点,也就是改变一重指针的内容,因此我们需要用到指向该一重指针的指针,也就是二重指针,听起来很难理解,但是实际上我们可以把一重指针想象成一个普通变量,我们要在函数里修改该变量并且将其返回主函数,要么是有返回值,要不然就是传入该变量的地址,通过该地址来改变,也即使传入该变量的指针,这么说想必大家就明白了这两种方法的区别。链表初始化的问题也就搞明白了,链表初始化的目的就是我们要新建一个头指针,让其指向为空。
怎样定义单链表,并初始化
以运滚下是C语言描述,首悄运
单链表的定义:
struct sNode{
ElemType data;
struct sNode* next;
};
单链表的初始化只需把单链表的表头置为空者梁即可:
void InitList(struct sNode** HL)
{
*HL=NULL;
}
关于单链表初始化的问题
一般malloc之后的节点空间都需要释放的,释放出错那可能是你的p地址操作到了非法部分!也
就是程序的问题!
给个范例你看看:
#include stdio.h
#include stdlib.h
#define NUM 10 //总共10个节点(包含头结点)
typedef struct node//结点
{
int num;//编号
int data;//数据
struct node* next;//下一个结点
}Node,*pNode;
InitList( const pNode phead )
{
pNode endNode=phead;//指向最后一个节点
pNode add = NULL; //要添加的节点
int i=1;
for ( ; iNUM; i++ )
{
if ( NULL==(add = (pNode)malloc(sizeof(Node))) )
{
printf("memory overflow!\n");
}
printf("Please enter %dth Node data:",i);
scanf("%d",add-data);
add-num = i; //编号从1--9
//新添加的节点指针域指向尾节点的下一个节点,即NULL
//等同于 add-next = NULL;
add-next = endNode-next;
//原先的尾节点指针域指向新添加的节点
endNode-next = add;
//更新尾节点,将新添加的节点作为新的尾节点
endNode = add;
}
}
void main(void)
{
pNode phead = NULL;
pNode temp = NULL;
int i=0;
//初始化头结点(第0个节点)
if ( NULL==(phead = (pNode)malloc(sizeof(Node))) )
{
printf("memory overflow!\n");
}
phead-num = 0;//编号为0
phead-next = NULL;//next指向空指针
//初始化其他节点
InitList( phead );
//显示最终建成的链表
temp = phead; //中间变量指针指向头结点
printf("this is the list that you create:\n");
for ( ; iNUM; i++ )
{
printf("\t%d\t%d\n",temp-num,temp-data);
temp = temp-next;
}
//从头结点开始依次free
while ( NULL != phead )
{
temp = phead-next;
free(phead);
phead = temp;
}
}
[img]关于链表初始化和链表初始化为什么要新生成结点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。