当前位置:网站首页 > 区块链基础 > 正文

单向链表排序算法(单向链表有序吗)

#include

#include

#include

int over_flag=0;

typedef int ElemType;

typedef struct LNode

{

ElemType data;

struct LNode *next;

}LNode,*LinkList;

void Traverse(LinkList L);

void CreateList(LinkList &L);

void exchange(LinkList &L);

void Deleteou(LinkList &L);

void Deletechong(LinkList &L);

void Insert_Sort(LinkList &L,ElemType e);

void Create_Sort(LinkList &L);

void Hebing(LinkList La,LinkList Lb,LinkList &Lc);

void Fenjie(LinkList &L);

//用头插法建立无序链表

void CreateList(LinkList &L)

{

int e;

printf("请输入链表元素数值(以0结束):

");

L = (LinkList)malloc(sizeof(LNode));

L->next = NULL;

LinkList q=L;

scanf("%d",&e);

while(e!=0)

{

LinkList p;

p = (LinkList)malloc(sizeof(LNode));

p->data = e;

p->next = NULL;

q->next = p;

q = q->next;

scanf("%d",&e);

}

Traverse(L);

}

//遍历单向链表

void Traverse(LinkList L)

{

LinkList i=L->next;

printf("链表的元素遍历为:");

while(i)

{

printf("%d ",i->data);

i=i->next;

}

printf("

");

}

//把单向链表中的元素逆置

void exchange(LinkList &L)

{

LinkList pa,pb;

pa=L->next;

L->next=NULL;

while(pa)

{

pb=pa;

pa=pa->next;

pb->next=L->next;

L->next=pb;

}

}

//在单向链表中删除所有偶数元素结点

void Deleteou(LinkList &L)

{

printf("删除偶数结点后的链表为:

");

LinkList q=L;

LinkList p=L->next;

while(p)

{

if(p->data%2==0)

{

LinkList r=p;

q->next=p->next;

p=p->next;

free(r);

}

else

{

p=p->next;

q=q->next;

}

}

Traverse(L);

}

//直接插入排序算法

void Insert_Sort(LinkList &L,ElemType e)

{

LinkList p,s;

s=(LinkList)malloc(sizeof(LNode));

s->data=e;

p=L;

while(p->next&&p->next->data<=e)

p=p->next;

s->next=p->next;

p->next=s;

}

//建立递增有序的单向链表

void Create_Sort(LinkList &L)

{

ElemType e;

L=(LinkList)malloc(sizeof(LNode));

L->next=NULL;

printf("请输入单向链表的元素数值,以0结束

");

scanf("%d",&e);

while(e)

{

Insert_Sort(L,e);

scanf("%d",&e);

}

}

//删除链表中的重复元素

void Deletechong(LinkList &L)

{

LinkList p,q,temp1,temp2;

p=L->next;

q=p->next;

while(p->next)

{

temp1=p;

while(q)

{

if(p->data!=q->data)

{

q=q->next;

temp1=temp1->next;

}

else

{

temp2=q;

q=q->next;

temp1->next=q;

free(temp2);

}

}

p=p->next;

q=p->next;

}

Traverse(L);

}

//利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表

void Hebing(LinkList La,LinkList Lb,LinkList &Lc)

{

LinkList p,q,s,rear;

p=La->next;

q=Lb->next;

Lc=rear=La;

free(Lb);

while(p&&q)

{

if(p->data data)

{

s=p;

p=p->next;

}

else

{

s=q;

q=q->next;

}

rear->next=s;

rear=rear->next;

}

if(p)

rear->next=p;

else

rear->next=q;

}

//利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数

void Fenjie(LinkList &L)

{

printf("分解成两个链表:

");

LinkList A=L;

LinkList B=(LinkList)malloc(sizeof(LNode));

B->next=NULL;

LinkList Lb=B;

int i=1;

LinkList La=L;

LinkList p=L->next;

while(p)

{

if(i++%2==0)

{

La->next=p->next;

p->next=NULL;

Lb->next=p;

Lb=Lb->next;

p=La->next;

}

else

{

p=p->next;

La=La->next;

}

}

printf("链表A:");

Traverse(A);

printf("链表B:");

Traverse(B);

}

//主函数

void main()

{

LinkList La,Lb,Lc;

int select;

do

{

printf("

");

printf("*链表的应用*

");

printf("

");

printf("

1 键盘输入一组元素,建立一个无头结点的单向链表(无序),遍历(打印)单向链表

");

printf("2 把单向链表中元素逆置(不允许申请新的结点空间)

");

printf("3 删除所有偶数元素的结点

");

printf("4 对链表排序,排序后链表元素按照非递减方式排列

");

printf("5 利用算法1建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)

");

printf("6 利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表

");

printf("7 删除链表中的重复元素

");

printf("8 选作11

");

printf("0 退出

");

scanf("%d",&select);

switch(select)

{

case 0:

break;

case 1:

CreateList(La);

break;

case 2:

printf("原链表为:

");

Traverse(La);

exchange(La);

printf("逆置后的链表为:

");

Traverse(La);

break;

case 3:

Traverse(La);

printf("该链表变为:");

Deleteou(La);

break;

case 4:

Create_Sort(La);

printf("按非递减方式排列后的链表链表为:

");

Traverse(La);

break;

case 5:

printf("分解前的链表为:");

Traverse(La);

printf("分解后的链表为:");

Fenjie(La);

break;

case 6:

printf("建立两个非递减有序单向链表,然后合并成一个非递减链表

");

printf("输入第一个链表的元素数值:

");

Create_Sort(La);

Traverse(La);

printf("输入第二个链表的元素数值:

");

Create_Sort(Lb);

Traverse(Lb);

Hebing(La,Lb,Lc);

printf("合并后的非递减链表:

");

Traverse(Lc);

break;

case 7:

printf("算法1生成的链表为:

");

Traverse(La);

printf("删除重复元素后的链表为:

");

Deletechong(La);

break;

case 8:

printf("建立两个非递减有序单向链表,然后合并成一个非递增链表

");

printf("输入第一个链表的元素数值:

");

Create_Sort(La);

Traverse(La);

printf("输入第二个链表的元素数值:

");

Create_Sort(Lb);

Traverse(Lb);

Hebing(La,Lb,Lc);

exchange(Lc);

printf("合并后的非递增链表:

");

Traverse(Lc);

break;

default:

printf("输入错误,请重新输入!

");

}

}while(select);

到此这篇单向链表排序算法(单向链表有序吗)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 跳转链接制作工具(跳转链接制作工具有哪些)2026-04-13 16:36:09
  • b站视频怎么弄成链接(b站视频怎么添加视频链接)2026-04-13 16:36:09
  • 天气预报链接(天气预报链接怎么弄)2026-04-13 16:36:09
  • 对于一个设有头指针和尾指针的单链表(设有一头指针为l的带有表头结点的非循环双向链表)2026-04-13 16:36:09
  • 反编译exe文件会自动链接dll吗(exe文件反编译后能得到完整的源码吗?)2026-04-13 16:36:09
  • 单向链表存储密度高吗(单向链表在内存中是连续存储的)2026-04-13 16:36:09
  • 在新标签页中打开链接(在新标签页中打开链接怎么弄)2026-04-13 16:36:09
  • 腾讯文档怎么变成链接(腾讯文档怎么变成链接状态)2026-04-13 16:36:09
  • 短链接防红跳转(防红短链接生成接口地址)2026-04-13 16:36:09
  • 单向链表(单向链表的特点)2026-04-13 16:36:09
  • 全屏图片