C语言在单链表中插入一个结点
以前面建立的动态链表为例,编写一个函数,能够在链表中指定位置插入一个结点。
假定链表已按升序排列,将要插入的结点依次与链表中的各结点比较,寻找要插入的位置。结点可以插在表头,表中或表尾。
结点在插入过程中存在以下几种情况:
(1)如果原表是空表,只需使链表的头指针head
指向被插结点即可。
(2)如果如果被插结点值最小,则应插入第一个结点之前,这种情况下使头指针head
指向被插结点,被插结点的指针域指向原来的第一结点即可。
(3)如果在链表中某位置插入,使插入位置的前一结点的指针域指向被插结点,被插结点的指针域指向插入位置的后一结点即可。
(4)如果被插结点值最大,则在表尾插入,使原表尾结点指针域指向被插结点,被插结点指针域指向NULL
即可。
node * insert(node * head, int x)
{
node * last, * current, * p;
//要插入的结点
p = (node *)malloc(sizeof(node));
p->num = x;
//空表插入
if(head == NULL)
{
head = p;
p->next = NULL;
return head;
}
//找插入位置
current = head;
while(x > current->num && current->next != NULL)
{
last = current;
current = current->next;
}
if(x <= current->num)
{
if(head == current)//在第一结点之前插入
{
p->next = head;
head = p;
return head;
}
else//中间位置插入
{
p->next = current;
last->next = p;
return head;
}
}
else//链尾插入
{
current->next = p;
p->next = NULL;
return head;
}
}