C++线性表(单链表)的应用算法(附源码)
C++线性表(单链表)的应用算法线性表(单链表)的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。运行截图代码实现/*线性表(单链表)的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表。*/#include <stdio.h>#include <stdli
·
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;
}
}
}
代码小白,仅作学习记录📝
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)