数据结构学习日记-递增的整数序列链表的插入

要求

实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。

首先是带头结点的链表创建函数,由于博主是初学者,所以仅根据自己的理解写了一个函数,可能不够规范,但实现了想达到的效果,会在以后改进。

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 
#include 
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

你可能感兴趣的:(数据结构,链表)