在一个有序(按非递减顺序)的链表中插入一个元素为x的结点,使插入后的链表仍然有序(链表数据域为整型数,初始时输入6个元素)。
程序运行示例如下:
输入数组6个元素的值。
12 23 34 45 56 67
此链表各个结点的数据域为:12 23 34 45 56 67
输入要插入的数据x:36
插入后链表各个结点的数据域为:12 23 34 36 45 56 67
链表插入图示:
代码实现:
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
int num;
struct link* next;
};
struct link* Input(struct link* head) //函数功能--输入六个数
{
int i = 0;
int data;
for (i = 0; i < 6; i++)
{
scanf("%d", &data);
//创建一个新节点
struct link* p = NULL, * last = head;
p = (struct link*)malloc(sizeof(struct link));
if (p)
{
p->num = data;
p->next = NULL;
}
if (head == NULL) //若原链表为空,则新建节点为头节点
head = p;
else
{
//找到上一个节点
while (last->next)
{
last = last->next;
}
//将新节点接入链表末尾
last->next = p;
}
}
return head;
}
void Dispaly(const struct link* head) //函数功能--打印链表
{
struct link* p = NULL;
p = head;
while (p->next != NULL)
{
printf("%d ", p->num);
p = p->next;
}
printf("%d\n", p->num);
}
void Insert(struct linkl* head, int n)
{
struct link* p = head;
struct link* new = NULL; //用输入的数创造一个新节点
new = (struct link*)malloc(sizeof(struct link));
while (p->next->num < n) //根据大小寻找插入位置
{
p = p->next;
}
//找到插入点后
new->next = p->next;//新的结点指向插入点的下一个结点
new->num = n; //新结点存放要插入的数
p->next = new; //插入点的上一个结点指向新的结点
}
int main()
{
printf("输入数组6个元素的值。\n");
struct link* head = NULL;
head = Input(head);
printf("此链表各个结点的数据域为:");
Dispaly(head);
printf("输入要插入的数据x:");
int n;
scanf("%d", &n);
Insert(head, n);
printf("插入后链表各个结点的数据域为:");
Dispaly(head);
}