要求
实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
首先是带头结点的链表创建函数,由于博主是初学者,所以仅根据自己的理解写了一个函数,可能不够规范,但实现了想达到的效果,会在以后改进。
typedef struct LNode* List;
struct LNode {
int data; /*存储结点数据*/
List Next; /*指向下一结点的指针*/
};
List creat(List L,int M) /*L为头结点,M为链表长度*/
{
List p1, p2; /*定义两个临时变量,用于创建新节点*/
int n = 1; /*用于控制有序链表的长度*/
p1 = p2 = (List)malloc(sizeof(struct LNode));
scanf_s("%d", &p1->data); /*输入链表第一个结点的数据至p1*/
while (n < M) /*输入M个数之后跳出循环*/
{
if (n == 1)L->Next= p1; /*如果n为1,则为第一个结点,使头结点指向第一个结点*/
else p2->Next = p1; /*n不为1,使p2的Next指向p1新开辟的空间,起链接作用*/
p2 = p1;
p1 = (List)malloc(sizeof(struct LNode));
scanf_s("%d", &p1->data);
n++; /*再输入一个数后n++*/
}
p2->Next = p1; /*此语句为链接倒数第二个结点和最后一个结点*/
p1->Next = NULL; /*使最后一个结点的指针为NULL*/
return L; /*返回头结点*/
}
接下来是插入函数,将要插入的数X与链表中的数一一比较,找出大于X的结点,将X插到该结点前。
List Insert(List L, int X)
{
List pre, tmp;
pre = L;
while (pre->Next != NULL)
{
if (pre->Next->data > X)break;
else pre = pre->Next;
}
tmp = (List)malloc(sizeof(struct LNode));
tmp->data = X;
tmp->Next = pre->Next;
pre->Next = tmp;
return L;
}
整体代码
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode* List;
struct LNode {
int data;/*存储结点数据*/
List Next;/*指向下一结点的指针*/
};
int main()
{
List creat(List L, int M);
List Insert(List L, int X);
List L,loc;
L = (List)malloc(sizeof(struct LNode));
loc= (List)malloc(sizeof(struct LNode));
int M, X;
scanf_s("%d", &M);
L = creat(L,M);
scanf_s("%d", &X);
L = Insert(L, X);
loc = L->Next;/*loc为头结点指向的第一个带有数据的结点*/
while (loc->Next != NULL)
{
printf("%d ", loc->data);
loc = loc->Next;
};
printf("%d", loc->data);/*由于最后一个结点的Next部分为NULL,所以不会输出,补一个输出函数进行输出*/
return 0;
}
List creat(List L,int M) /*L为头结点,M为链表长度*/
{
List p1, p2; /*定义两个临时变量,用于创建新节点*/
int n = 1; /*用于控制有序链表的长度*/
p1 = p2 = (List)malloc(sizeof(struct LNode));
scanf_s("%d", &p1->data); /*输入链表第一个结点的数据至p1*/
while (n < M) /*输入M个数之后跳出循环*/
{
if (n == 1)L->Next= p1; /*如果n为1,则为第一个结点,使头结点指向第一个结点*/
else p2->Next = p1; /*n不为1,使p2的Next指向p1新开辟的空间,起链接作用*/
p2 = p1;
p1 = (List)malloc(sizeof(struct LNode));
scanf_s("%d", &p1->data);
n++; /*再输入一个数后n++*/
}
p2->Next = p1; /*此语句为链接倒数第二个结点和最后一个结点*/
p1->Next = NULL; /*使最后一个结点的指针为NULL*/
return L; /*返回头结点*/
}
List Insert(List L, int X)
{
List pre, tmp;
pre = L;
while (pre->Next != NULL)
{
if (pre->Next->data > X)break;
else pre = pre->Next;
}
tmp = (List)malloc(sizeof(struct LNode));
tmp->data = X;
tmp->Next = pre->Next;
pre->Next = tmp;
return L;
}
输出示例
5
1 2 3 5 6
4
1 2 3 4 5 6