当前位置:首页 » 操作系统 » c链表的排序算法

c链表的排序算法

发布时间: 2022-08-03 12:15:27

c语言数据结构(双向链表排序)

#include<stdio.h>
#include<malloc.h>

#define ElemType int

int count=0;

typedef struct DulNode
{
ElemType data;
DulNode *prior;
DulNode *next;
}DulNode,*DulLinkList;

//初始化链表,结束后产生一个头结点指针
void InitDLList(DulLinkList *L)
{
(*L)=(DulLinkList)malloc(sizeof(DulNode));
(*L)->next=*L;
(*L)->prior=(*L)->next;
}
//对链表进行插入操作
void ListInsert(DulLinkList *L)
{
int i=0,n;
ElemType temp;
DulNode *s,*p;
p=(*L)->next;
printf("请输入插入元素数量:\n");
scanf("%d",&n);
count=n;
printf("请输入%d个自然数\n",n);
while(i<n)
{
scanf("%d",&temp);
s=(DulNode*)malloc(sizeof(DulNode));
s->data=temp;
while((p!=(*L))&&(p->data<temp))//查找所要插入的位置
{
p=p->next;
}

s->prior=p->prior;//新节点的插入
s->next=p;
p->prior->next=s;
p->prior=s;

p=(*L)->next;//将指针回指到链表第一个非空节点,主要是为了下次查找插入位置
i++;
}
}
void Display(DulLinkList L)
{
DulNode *p;
p=L->next;
printf("双向链表中的数据为:\n");
while(p!=L)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void Sort(DulLinkList *L)
{
ElemType temp;
DulNode *p,*q;
p=(*L)->next;
q=(*L)->prior;
if(count%2!=0)
q=q->prior;
p=p->next;

while(p!=q)
{
temp=p->data;
p->data=q->data;
q->data=temp;

p=p->next;

if(p!=q) //第二题只需交换节点数据
q=q->prior;//这几个if else语句需要仔细
else
break;
if(p!=q)
p=p->next;
else
break;
if(p!=q)
q=q->prior;
else
break;
}

}
void main()
{
DulLinkList L;
InitDLList(&L);//初始化链表
ListInsert(&L);//顺序插入数据
Display(L);//显示结果
Sort(&L);//第二题操作
Display(L);//第二题输出结果
}

⑵ 链表选择排序的C语言算法实现

common.h
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
linklist.h
#include common.h
typedef int ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
}Node, *LinkList; /* LinkList为结构指针类型*/
void CreateFromTail(LinkList L)
{
Node *r, *s;
char c;
int flag =1; /*设置一个标志,初值为1,当输入$时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
} 尾插法创建链表程序
/*_*====尾插法创建链表,返回链表头指针====*_*/
LinkList CreateFromTail2()
{
LinkList L;
Node *r, *s;
int c;
int flag =1;
L=(Node * )malloc(sizeof(Node));
L->next=NULL;
r=L;
while(flag)
{
scanf(%d,&c);
if(c!=-1)
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
return L;
} void linkSort(LinkList l)
{
Node *p,*q,*m,*n;
Node *temp1,*temp2;
if(l->next==NULL)
printf(NO LINKLIST!!!);
else
{
p=l;q=l->next;
while(q->next!=NULL)
{
m=p->next;
n=q->next;
temp1=m;
while(temp1->next!=NULL)
{
if(temp1->next->data<q->data && temp1->next->data<n->data)
{
m=temp1;n=temp1->next;
}
temp1=temp1->next;
}/*_*====此循环用于找到基准(q)以后的序列的最小的节点=====*_*/
if(m!=p->next || (m==p->next && m->data>n->data))
{
p->next=n;
p=n;
m->next=q;
m=q;
q=q->next;
n=n->next;
p->next=q;
m->next=n;
}/*_*======此条件用于交换两个节点*_*/
else
{
p=p->next;
q=q->next;
}/*_*======此条件用于没有找到最小值时的p,q后移操作*_*/
}/*_*=====外循环用于从前往后扫描,通过移动p,q指针实现=======*_*/
temp2=l->next;
printf(List after sorting is: );
while(temp2!=NULL)
{
printf(%5d,temp2->data);
temp2=temp2->next;
}
}
printf( );
} void main()
{
Node *temp3;
LinkList l;
printf( =====(end by -1)====== press enter after input the nember each time: );
l=CreateFromTail2();
temp3=l->next;
if(temp3==NULL)
printf(NO LINKLIST!!!);
else
{
printf(List before sorting is: );
while(temp3!=NULL)
{
printf(%5d,temp3->data);
temp3=temp3->next;
}
}
printf( );
linkSort(l);
}

⑶ C语言 链表怎么排序 急求大虾

排序!这是一个庞大的话题,有插入排序,插入排序又分直接插入排序、希尔排序等,还有交换排序,交换排序有冒泡排序、快速排序,还有选择排序,有直接选择排序、归并排序等等…而且还不断的有新的排序方法产生…不知道你要哪一种…新手一般用选择排序和冒泡排序,方法简单,两重循环。

⑷ 关于C语言中,关于链表数据部分排列顺序的问题。

定义一个结构体,结构体包括学生的姓名,学号,英语,数学,语文,平均成绩,每个结构体作为顺序链表的节点,对链表进行排序,排序算法可以用冒泡排序法,根据节点中的英语成绩进行排序,冒泡排序是要定义一个临时变量的。节点交换即可

⑸ C语言链表排序问题

C指的是空白的临时节点 是NULL么 你交换的地方就有问题 如果c是NULL c->next = a 就段错误了,而且在交换块的代码也不能用头指针, 你的代码实现有挺多不合理的地方,
如果是 a->b->c->d 交换b c
b->next = c->next; //b->d
a->next = c //a->c
c->next = b //c->b 连起来就是 a->c->b->d
所以单链表交换节点还需要一个变量 就是上面我说的a, 每次循环还要a = a->next
你的d是固定的 不对 指针往下走没有判空 有越界

⑹ C语言做链表的排序

主要修改了sort函数,采用冒泡排序算法进行排序的。
你其他的两个函数写的不错,就sort函数写的有问题,已经很不错了。
注意:程序结束,最好对链表进行销毁,否则,内存永远也不会释放,导致内存泄漏了。

修改如下:

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

#define N 5
typedef struct node
{
char name[20];
int score;
struct node *link;
}stud;

stud *sort(stud *head) /*排序函数*/
{
stud *temp=NULL; //默认为NULL,也就是链表的结尾
stud *ptr1=head;
stud *ptr2=head->link;

while(ptr1->link!=temp)//(ptr1!=NULL)
{
//ptr2=ptr1->link; //放在循环体下面了
while(ptr2->link!=temp)//(ptr2!=NULL)
{
if(ptr1->link->score > ptr2->link->score) //(ptr1->score > ptr2->score)
{//交换 ptr1->link和ptr2->link,而不是ptr1和ptr2,否则无法交换
ptr1->link=ptr2->link;
ptr2->link=ptr2->link->link;//temp->link=ptr2;
ptr1->link->link=ptr2;//ptr2->link=ptr1;
}
ptr1=ptr1->link;//ptr2=ptr2->link;
ptr2=ptr1->link;//从上面移动下来的
}
temp=ptr2;//新加的
ptr1=head;//ptr1=ptr1->link;
ptr2=ptr1->link;//从上面移动下来的
}
return (head);
}

stud * creat(int n)
{
stud *p,*h,*s;
int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配内存空间!");
exit(0);
}
s->link=NULL;//p->link=s; //跟下句对调了一下,为了把相关的代码放在一起
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name);
printf("请输入第%d个人的分数",i+1);
scanf("%d",&s->score);
p->link=s; //s->link=NULL;//跟上句对调了一下,为了把相关的代码放在一起
p=s;
}
return(h);
}

void print(stud *h)
{
stud *p;

p=h->link;
printf("数据信息为:\n");
while(p!=NULL)
{
printf("%s ",&*(p->name));
printf("的分数为%d\n",p->score);
p=p->link;
}
}

void main()
{
stud *head;
head=creat(N);
head=sort(head);
print(head);
getchar();
}

⑺ C语言链表排序

#include"stdafx.h"

#include<stdlib.h>

//创建一个节点,data为value,指向NULL

Node*Create(intvalue){

Node*head=(Node*)malloc(sizeof(Node));

head->data=value;

head->next=NULL;

returnhead;

//销毁链表

boolDestroy_List(Node*head){

Node*temp;

while(head){

temp=head->next;

free(head);

head=temp;

head=NULL;

returntrue;

//表后添加一个节点,Create(value)

boolAppend(Node*head,intvalue){

Node*n=Create(value);

Node*temp=head;

while(temp->next){

temp=temp->next;

temp->next=n;

return0;

//打印链表

voidPrint_List(Node*head){

Node*temp=head->next;

while(temp){

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

temp=temp->next;

printf("\n");

//在链表的第locate个节点后(头节点为0)插入创建的节点Create(value)

boolInsert_List(Node*head,intlocate,intvalue){

Node*temp=head;

Node*p;

Node*n=Create(value);

if(locate<0)

returnfalse;

while(locate--){

if(temp->next==NULL){

temp->next=Create(value);

returntrue;

temp=temp->next;

p=temp->next;

temp->next=n;

n->next=p;

returntrue;

//删除第locate个节点后(头节点为0)的节点

boolDelete_List(Node*head,intlocate){

Node*temp=head;

Node*p;

if(locate<0)

returnfalse;

while(locate--){

if(temp==NULL){

returnfalse;

temp=temp->next;

p=temp->next->next;

free(temp->next);

temp->next=NULL;

temp->next=p;

returntrue;

//获取链表长度(不包括头节点)

intSize_List(Node*head){

Node*temp=head;

intsize=0;

while(temp->next){

temp=temp->next;

size++;

returnsize;

//链表的三种排序(选择,插入,冒泡)

boolSort_List(Node*head){

intt=0;

intsize=Size_List(head);

//选择排序

/*for(Node*temp=head->next;temp!=NULL;temp=temp->next){

for(Node*p=temp;p!=NULL;p=p->next){

if(temp->data>p->data){

printf("换%d和%d\n",temp->data,p->data);

t=temp->data;

temp->data=p->data;

p->data=t;

}*/

//插入排序

/*for(Node*temp=head->next->next;temp!=NULL;temp=temp->next){

for(Node*p=head;p->next!=NULL;p=p->next){

if(p->next->data>temp->data)

printf("换%d和%d\n",temp->data,p->next->data);

t=temp->data;

temp->data=p->next->data;

p->next->data=t;

}*/

//冒泡排序

for(Node*temp=head->next;temp->next!=NULL;temp=temp->next){

for(Node*p=head->next;p->next!=NULL;p=p->next){

if(p->data>p->next->data){

t=p->data;

p->data=p->next->data;

p->next->data=t;

return0;

(7)c链表的排序算法扩展阅读:

return表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。

return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

⑻ C语言单向链表排序如何实现

struct student* printf_sort(struct student *head)
{
struct student *p1,*p2,*ptemp,*pfinished=NULL;
for(p1=head;p1->next!=pfinished;)//对链表进行从大到小排序(这里用冒泡法)
//p1使之总是指向头结点,pfinished使之总是指向已排序好的最前面的结点
//ptemp作为中介,保存p2的上一个结点
{
for(p2=p1;p2->next!=pfinished;)
{
if(p2->num<p2->next->num)//p2的值小于p2->next的值,交换 {
if(p2==p1)//头结点要交换
{
p1=p2->next;
p2->next=p1->next;
p1->next=p2;
ptemp=p1;
}
else
{
ptemp->next=p2->next;
ptemp=p2->next;
p2->next=ptemp->next;
ptemp->next=p2;
}
}
else//不需要交换,则p2、ptemp前进1位
{
ptemp=p2;
p2=p2->next;
}
}
pfinished=p2;
}
}

⑼ C语言:单链表排序 有三个单链表程序 想知道每句运行下的意思(算法)

1:Linklist * inserSort(Linklist *L) /*函数参数是一个链表的指针L,返回的也是这个指针,是排序好了的链表。*/
2:{
3: Linklist *p=L->next;/*p指向链表第一个节点。*/
4: Linklist *r;
5: Linklist *q;
6: int i;
7: int j;
8: int x;
9: int n=lengList(L);/*获取链表的节点总个数,存入n。*/
10: for(i=1;i<n;i++)/*这个for循环配合23行,让p依次指向链表的第1个节点到倒数第2个节点。
这显而易见啊:循环了n-1次,每次都执行23行“p=p->next”。*/
11: {
12: q=p->next;/*让q指向p的下一个节点*/
13: for(j=i+1;j<=n;j++)/*12行、这行的for循环和21行,让q依次指向p之后的节点一直到链表末尾。*/
14: {
15: if(p->data>q->data) /*看p中的数据是否比q中的大*/
16: {
17: x=p->data; /*这17,18,19三行是交换pq两节点的数据*/
18: p->data=q->data; /**/
19: q->data=x; /**/
20: }
21: q=q->next;
22: }
23: p=p->next;
24: }
25: return L;
26:}

以下是上面解释的动态例子:括号中是链表节点的数据,共4个节点,用1234标明。
1(5)->2(8)->3(2)->4(7)
i=1时:p->1(5)
j=2时:
p->1(5),q->2(8),if不成立,q->3(2)
j=3时:
p->1(5),q->3(2),if成立,交换,链表为1(2)->2(8)->3(5)->4(7),q->4(7)
j=4时:
p->1(2),q->4(7),if不成立q->5(null)
i=2时: p->2(8)
j=3时:
p->2(8),q->3(5),if成立,交换,链表为1(2)->2(5)->3(8)->4(7),q->4(7)
j=4时:
p->2(5),q->4(7),if不成立,q->5(null)
i=3时:p->3(8)
j=4时:
p->3(8),q->4(7),if成立,交换,链表为1(2)->2(5)->3(7)->4(8),q->5(null)
至此,排序流程走完,链表从5827排成了2578。

很不好意思,笔者由于重重原因现在仅能完成第一部分,希望能帮上你。

⑽ C语言,链表怎么从大到小排序

//创建data型结构,为生成链表做准备
struct data
{
int value;
data *next;
};

//对链表进行排列的函数
void line(data *p,int n)
{ int temp,i,j;
data *tp;
for(i=0;i<n-1;i++)
for(j=0,tp=p;j<n-i-1;j++,tp=tp->next)
{ if(tp->value>tp->next->value)
{temp=tp->next->value;
tp->next->value=tp->value;
tp->value=temp;
}
}
}
以上是冒泡法对链表排序的例子;
//输出答案的函数
void answer(data *p)
{ while(p!=NULL) {
cout<<p->value<<endl;
p=p->next;

}
}
以上是遍历链表的函数p是链表的头指针

热点内容
我家小镇更新密码是多少 发布:2025-01-18 00:22:39 浏览:168
手动挡停车场安卓和苹果怎么连 发布:2025-01-18 00:11:45 浏览:359
斗鱼下载后输入什么密码才能下载 发布:2025-01-18 00:04:09 浏览:81
跳出游标sql 发布:2025-01-17 23:42:26 浏览:774
通达信软件源码 发布:2025-01-17 23:41:48 浏览:698
百度云上传的照片不全 发布:2025-01-17 23:41:36 浏览:887
f7x哪个配置值得入手 发布:2025-01-17 23:40:12 浏览:906
谷歌输入法的贴纸安卓怎么用 发布:2025-01-17 23:35:33 浏览:217
邻接种子算法 发布:2025-01-17 23:34:28 浏览:312
日记密码是什么 发布:2025-01-17 23:27:48 浏览:209