首先弄懂头指针与首元结点的概念,头指针指向首元结点,首元结点就是链表第一个有数据的结点;
头插法1:
int Create_List_Head(PNode *h, ElementType data) //*h代表首元结点,因为h头指针指向首元结点地址,*h则取地址内容(数据域+指针域)就是首元结点
{
// 创建一个新的结点,并分配空间
PNode p = (PNode)malloc(sizeof(Node)/sizeof(char));
if (p == NULL)
{
return MALLOC_ERROR;
}
// 将新数据赋给新结点
p->data = data;//将数据给新建结点
p->next = *h;//将新建结点指向原先的首元结点,就实现头插
*h = p;插完之后新建结点就变成了首元结点,所以将新建结点赋给首元结点;
}
头插法2:
int Create_List_Head(PNode h, ElementType data) //h代表头指针
{
// 创建一个新的结点,并分配空间
PNode p = (PNode)malloc(sizeof(Node)/sizeof(char));
if (p == NULL)
{
return MALLOC_ERROR;
}
// 将新数据赋给新结点
p->data = data;//将数据给新建结点
p->next = h->next;//将 新建结点 指向 原先的首元结点(h->next),这时候p变成首元结点
h ->next = p;头指针指向p,方便后来再头插,完成头插,
}
这两种方法只要注意好*h与h,确定好首元结点的位置,然后画一下图就很好理解!
尾插法:(头插弄懂尾插就很好理解)
int Create_List_Tail(PNode *h, ElementType data)
{
PNode node = (PNode)malloc(sizeof(Node)/sizeof(char)); //定义新结点,将数据赋值给定义结点,并且定义结点指针指向NULL(因为尾插).
if (node == NULL)
{
return MALLOC_ERROR;
}
node->data = data;
node->next = NULL;
// 将node加入到链表最后,此处要考虑是否非空表
if (*h == NULL) // 空表,首元结点是空
{
*h = node;
}
else // 非空表
{
PNode temp = *h; //再定义一个结点等于首元结点,因为遍历的时候我们不能动首元结点,所以定义一个temp代替首元结点
// 找最后一个结点
while (temp->next)//当首元结点遍历到空时(NULL)结束循环
{
temp = temp->next;//遍历结点
}
//当循环结束,说明找到尾节点
temp->next = node;//这里的temp代表遍历后的尾结点,现在我们要把新结点插在尾结点后面,temp->next=node;完成尾插
}
return OK;
}
465

被折叠的 条评论
为什么被折叠?



