单链表的头插法与尾插法

首先弄懂头指针与首元结点的概念,头指针指向首元结点,首元结点就是链表第一个有数据的结点;

头插法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;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值