链表(课下作业)
写出单链表插入和删除一个节点的伪代码算法
插入节点:
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.链表(单项链表的建立,删除,插入,打印)