链表(课下作业)

写出单链表插入和删除一个节点的伪代码算法

插入节点:
1.若原链表是空表,将新节点p作为头节点(head = p)。
2.若原链表非空,则按节点值的大小,确定插入新节点的位置。若在头位置插入节点,则将新节点的指针域指向下一节点(p->next = head),且让head指向新节点(head = p)。
3.若在链表中间插入节点,则将新节点的指针域指向下一节点(p->next = pr->next),且让前一节点的指针域指向新节点(pr->next = p)。
4.若在表尾插入新节点,则末节点的指针域指向新节点(pr->next = p)。
在本例中:
插入
设节点ai-1为p,节点ai+1为q,插入的节点为t
则t—>next = p—>next(t的下一个节点变成了p的下一个节点)
t—>next = q
即插入节点t

**点击查看伪代码**
p->next = NULL
p->next = data
if(head == NULL)
  head = p
if(pr->data->data)
  p->next = head
  head = p
else
  p->next = pr->next
  pr->next = p
else
  pr->next = p

删除节点:
1.如果链表长度为0,则退出;
2.如果要删除的元素为头节点,则将head移至下一个节点(head = p->next)
3.如果要删除的元素为中间节点,则将前一节点的指针域指向当前节点的下一节点(pr->next = p->next);
4.释放已删除节点的内存,返回。
在本例中:
删除
设节点ai-1为p,节点ai+1为q,删除的ai为t
p—>next = t—>next(p的下一个节点变成了之前t的下一个节点)
free(t)

**点击查看伪代码**
if(p == head)
  head = p->next
else
  pr->next = p->next
free(p)

参考C教材内容,用C语言实现该算法

插入节点:

点击查看代码
/* 函数功能:向单向链表中插入数据 按升序排列*/
struct link *InsertNode(struct link *head, int nodeData)
{
    struct link *p = head, *pr = head, *temp = NULL;

    p = (struct link *)malloc(sizeof(struct link));
    if (p == NULL)
    {
        printf("No enough meomory!\n");
        exit(0);
    }
    p->next = NULL;        /* 待插入节点指针域赋值为空指针 */
    p->data = nodeData;

    if (head == NULL)    /* 若原链表为空 */
    {
        head = p;        /* 插入节点作头结点 */
    }
    else        /* 原链表不为空 */
    {
        while (pr->data < nodeData && pr->next != NULL)
        {
            temp = pr;        /* 保存当前节点的指针 */
            pr = pr->next;    /* pr指向当前节点的下一节点 */
        }
        if (pr->data >= nodeData)
        {
            if (pr == head)        /* 在头节点前插入新节点 */
            {
                p->next = head;    /* 新节点指针域指向原链表头结点 */
                head = p;        /* 头指针指向新节点 */
            }
            else
            {
                pr = temp;
                p->next = pr->next;        /* 新节点指针域指向下一节点 */
                pr->next = p;            /* 让前一节点指针域指向新节点 */
            }
        }
        else        /* 若在表尾插入新节点 */
        {
            pr->next = p;    /* 末节点指针域指向新节点*/
        }
    }

    return head;
}

删除节点:

点击查看代码
struct link *DeleteNode (struct link *head, int nodeData)
{
    struct link *p = head, *pr = head;

    if (head == NULL)
    {
        printf("Linked table is empty!\n");
        return 0;
    }
    while (nodeData != p->data && p->next != NULL)
    {
        pr = p;            /* pr保存当前节点 */
        p = p->next;    /* p指向当前节点的下一节点 */
    }
    if (nodeData == p->data)
    {
        if (p == head)    /* 如果待删除为头节点 (注意头指针和头结点的区别)*/
        {
            head = p->next;
        }
        else            /* 如果待删除不是头节点 */
        {
            pr->next = p->next;
        }
        free(p);        /* 释放已删除节点的内存 */
    }
    else            /* 未发现节点值为nodeData的节点 */
    {
        printf("This Node has not been found");
    }

    return head;
}

参考资料:
1.教材《C语言程序设计》
2.链表(单项链表的建立,删除,插入,打印)

posted @ 2022-10-20 20:51  煙_火_人_間  阅读(41)  评论(0编辑  收藏  举报