C++线性表(单链表)的应用算法

线性表(单链表)的应用算法:
构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。

运行截图

在这里插入图片描述

代码实现

/*
线性表(单链表)的应用算法:
构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct  Sqlist   //单链表结构体
{
	int data;
	Sqlist* next; //指针域
};

//初始化链表
void Start(Sqlist* L, Sqlist* M, Sqlist* N, Sqlist* H)//L初始链表 M奇数链表 N偶数链表 H合并后的链表
{
	//初始化链表为空
	L->next = NULL;  //L->next = NULL可代表L链表的尾节点(L->next代表L的下一个节点,下一个节点为NULL,则表示没有下一个节点,即为空)
	M->next = NULL;
	N->next = NULL;
	H->next = NULL;
	printf("【提示】初始化成功!\n");
}

//判断初始链表是否为空
void Emp(Sqlist* L)
{
	if (L->next == NULL)
		printf("【提示】链表为空!\n");
	else
		printf("【提示】链表存在数据!\n");
}

//求初始链表长度
void Length(Sqlist* L)
{
	Sqlist* p;
	int length = 0;
	p = L;
	//while(p->next!=NULL)//当p指针的后一节点不为空时(当不为尾节点时)
	while (p->next)//当p指针的后一节点存在时
	{
		length++;
		p = p->next;//往后移动指针p
	}
	printf("【提示】当前链表长度为:%d\n", length);
}

//在初始链表中插入数据元素(递增)
void Input(Sqlist* L, int n)
{
	Sqlist* q, * p;
	int i;
	for (i = 1; i <= n; i++)

	{	//输入一个数,用q来存放,如果p中是空的,就直接把q给p,如果p不是空的,则比较q和p中的大小,如果p小q大,直接将q新写入的存放到p中,否则则调换二者顺序再上述操作执行
		p = L;
		q = (Sqlist*)malloc(sizeof(Sqlist));
		printf("【提示】请输入第%d个数:", i);
		scanf("%d", &q->data);  //将数据保存到q中
		q->next = NULL;

		if (p->next == NULL)    //如果p->next为尾节点(p为空时)
			p->next = q;        //将q给p

		else
		{
			while (p->next->data < q->data)//当p所指向的(下一个)数据小于q所指向的数据
			{
				p = p->next;//p指向下一个节点(往后移)

				if (p->next == NULL)//p所指向的为尾节点时,结束
					break;
			}
			//交换pq所指向的节点的值
			q->next = p->next;
			p->next = q;
		}
	}
	printf("【提示】插入完成!\n");
}
void Output(Sqlist* L)
{
	Sqlist* p;
	p = L;
	while (p->next != NULL)
	{
		//printf("%4d", p->next->data);
		printf("\t%d", p->next->data);
		p = p->next;
	}
	printf("\n");
}

//将初始链表分成奇数链表和偶数链表
void Apart(Sqlist* L, Sqlist* M, Sqlist* N)
{
	Sqlist* j, * o, * p;
	p = L;
	while (p->next != NULL)//当p为非空时
	{
		p = p->next;
		if (p->data % 2 == 0)//判断是否为偶数
		{
			o = (Sqlist*)malloc(sizeof(Sqlist));
			o->data = p->data;//将p(初始链表)的数据给o(偶数链表)

			o->next = N->next;
			N->next = o;
		}
		else
		{
			j = (Sqlist*)malloc(sizeof(Sqlist));
			j->data = p->data;//将p(初始链表)的数据给j(奇数链表)

			j->next = M->next;
			M->next = j;
		}
	}

	printf("【提示】奇表:\n");
	Output(M);

	printf("【提示】偶表:\n");
	Output(N);
}

void Andbiao(Sqlist* J, Sqlist* O, Sqlist* H)
{
	Sqlist* m, * n, * t, * p;
	m = J;
	n = O;
	t = H;
	p = H;

	while (m->next && n->next)//当m和n的下一节点均不为空时
	{
		if (m->next->data > n->next->data)
		{
			t = (Sqlist*)malloc(sizeof(Sqlist));//开辟新节点t
			t->data = m->next->data;//将m中的数据复制到t中

			t->next = NULL;//定义t的头节点数据为空
			m = m->next;//指针m向后移动

			p->next = t;
			p = p->next;
		}
		else
		{
			t = (Sqlist*)malloc(sizeof(Sqlist));//开辟新节点t
			t->data = n->next->data;//将n中的数据复制到t中

			t->next = NULL;//定义t的头节点数据为空
			n = n->next;//指针n向后移动

			p->next = t;
			p = p->next; //指针p向后移动
		}
	}
	if (m->next == NULL)
	{
		while (n->next)
		{
			t = (Sqlist*)malloc(sizeof(Sqlist));//开辟新节点t
			t->data = n->next->data;//将n中的数据复制到t中

			t->next = NULL;//定义t的头节点数据为空
			n = n->next;//指针n向后移动

			p->next = t;
			p = p->next;
		}
	}
	if (n->next == NULL)
	{
		while (m->next)
		{
			t = (Sqlist*)malloc(sizeof(Sqlist));//开辟新节点t
			t->data = m->next->data;//将m中的数据复制到t中

			t->next = NULL;//定义t的头节点数据为空
			m = m->next;//指针m向后移动

			p->next = t;
			p = p->next;
		}
	}
	printf("【提示】合并递减表:\n");
	Output(H);
}

void main()
{
	Sqlist* Begain = (Sqlist*)malloc(sizeof(Sqlist));//初始(递增)
	Sqlist* Odd = (Sqlist*)malloc(sizeof(Sqlist));//奇数
	Sqlist* Even = (Sqlist*)malloc(sizeof(Sqlist));//偶数
	Sqlist* And = (Sqlist*)malloc(sizeof(Sqlist));//合并(递减)

	int choose = -1, n;

	printf(" ---------------------------\n");
	printf("|     1.初始化单链表        |\n");
	printf("|     2.建立递增链表        |\n");
	printf("|     3.分成奇/偶两链表     |\n");
	printf("|     4.合并成递减单链表    |\n");
	printf("|     5.显示单链表整体      |\n");
	printf("|     6.求单链表长度        |\n");
	printf("|     7.判断单链表是否为空  |\n");
	printf("|     0.退出                |\n");
	printf(" ---------------------------\n");
	while (choose)
	{
		printf("【提示】请输入你的选择:");
		scanf("%d", &choose);
		if (choose > 7)
		{
			printf("【提示】输入格式错误,请重新输入:");
			scanf("%d", &choose);
		}

		switch (choose)
		{
			//初始化
		case 1:Start(Begain, Odd, Even, And); break;
			//插入数据(递增)
		case 2:
			printf("【提示】请输入你要插入正整数的个数:");
			scanf("%d", &n);
			Input(Begain, n);
			break;
			//分离为奇/偶链表
		case 3:Apart(Begain, Odd, Even); break;
			//合并链表(递减)
		case 4:Andbiao(Odd, Even, And); break;
			//输出(递增)
		case 5:Output(Begain); break;
			//计算链表长度
		case 6:Length(Begain); break;
			//判断链表是否为空
		case 7:Emp(Begain); break;
			//退出
		case 0:exit(0); break;
		}
	}
}

代码小白,仅作学习记录📝

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐