链表的删除和插入

  • 对链表的删除
    假如一个动态链表有三个结点,分别是结点1, 结点2, 结点3。
    要删除结点2,就把结点3的地址指向结点1中存放地址的成员。但并未把结点2将它从内存中删除。二是将它从链表中分离开来。
    写一个函数删除动态链表中的指定结点。
struct student *del(struct student * head, long num)
{
    struct student *p1, *p2;
if (head == NULL)
{printf("\nlist null\n"); return (head);}
p1 = head;
while (num !== p1-> num && p1-> num !== NULL)
{
    p2 = p1;
    p1 = p1-> num;
}
if (num == p1 -> num)
{
    if (head == p1)
    {
        head = p1-> next;
    }
    else p2 -> next = p1 -> next;
    printf("delete:%ld\n" ,num);
    n = n - 1;
}
else printf("%ld is not been found!",num);
return (head);
}

这个函数的大致算法如下:
1.从第一个结点开始找要删除的num,如果不是执行p2 = p1,p1 -> next,如果是看第2。
2.要删除的链表是不是第一个结点,如果是,还要将head指向原来链表的第二个结点,如果不是,执行p2 ->next = p1 -> next。
3.链表是否是一个空链表,或者在这个链表中找不到要删除的链表。
- 链表的插入
链表的插入是将一个结点插入已有的链表中。
就像有一个已经按升高大小排好的一个队伍,但是来了一个新同学,这个新同学要和第一个同学比,如果比第一个同学高就不能站在他前面,在和第二个同学比,如果还比第二个同学高也不能站在他前面,就这样比下去,直到出现一个同学i,新同学比同学i高,但比同学i+1低,那么新同学就可以插在同学i和i+1之间。链表的插入的过程是一样的。
根据上面这个思路来实现链表的插入:首先将p0指向待插入的结点,p1指向第一个结点,看p0 -> num > p1 -> num,如果大于不能将p0 -> num插入到p1 -> num之前,将p1向后移动一个结点,使p2指向刚才p1指向的那个结点,直到出现p0 -> num小于p1 -> num,然后再看此时p1是否指向head,如果指向head,执行head = p0, p0 -> next = p1,如果没有指向head , 执行p2 -> next = p0, p0 -> next = p1。最后还要考虑,链表是否为空,以及p0要插入到表尾之后,如果要插入到表尾之后,则执行p1 ->next = p0, p0 ->= NULL。
写一个插入结点的函数。

struct student * insert(struct student * head,struct student * stud)
{
    struct srudent *p0,* p1,* p2;
    p1 = head;
    p0 = stud;
    if (head == NULL)
    {head = p0; p0 -> = NULL;}
    else
    {while(p0 -> num > p1-> num && p1 -> next!= NULL)
    {p2 = p1;
    p1 = p1-> num;
    }
    if (p0 -> num <= p1 -> num)
    {if (head == p1)
    {head = p0;
    else
    p2 -> next = p0;
    p0 -> next = p1;
    }
    else
    {p1 -> next = p0;
    p0 -> next = NULL;
    }
    n = n + 1;
    return (head);
}   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值