直接插入排序链表c语言代码(链表选择排序c语言)

本篇文章给大家谈谈直接插入排序链表c语言代码,以及链表选择排序c语言对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、求助~!【C语言】直接插入排序2、C语言的链表怎么排序3、C语言链表插入排序问题4、用C语言编写一个算法,实现有序链表的插入。链表有序且不允许有重复元素?

求助~!【C语言】直接插入排序

已经测试过可行。

#include”stdio.h”

#define MAXSIZE 20//一个用作示例的小顺序表的最大长度

int Insertsort(int r[],int n)

{//作直接插入排序

int i,j;

for(i=2;i=n;i++)

{ r[0]=r[i];//r[0]用作哨兵单元

j=i-1;

while(r[0]r[j])

{ r[j+1]=r[j];//记录后移

j–;

}//while

r[j+1]=r[0];//插入到正确位置

for(j=1;j=n;j++)//输出每趟排序的结果

{

printf(“%d “,r[j]);

}//for

printf(“\n”);

}//for

}//Insertsort

int main()

{

int n,i;//待排序的关键字个数

int r[MAXSIZE];

scanf(“%d”,n);

for(i=1;i=n;i++)//输入待排序的关键字

scanf(“%d”,r[i]);

Insertsort(r,n);

}

C语言的链表怎么排序

==========================

功能:选择排序(由小到大)

返回:指向链表表头的指针

==========================

*/

/*

选择排序的基本思想就是反复从还未排好序的那些节点中,

选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,

依次重新组合成一个链表。

我认为写链表这类程序,关键是理解:

head存储的是第一个节点的地址,head-next存储的是第二个节点的地址;

任意一个节点p的地址,只能通过它前一个节点的next来求得。

单向链表的选择排序图示:

—-[1]—-[3]—-[2]…—-[n]—-[NULL](原链表)

head 1-next 3-next 2-next n-next

—-[NULL](空链表)

first

tail

—-[1]—-[2]—-[3]…—-[n]—-[NULL](排序后链表)

first 1-next 2-next 3-next tail-next

图10:有N个节点的链表选择排序

1、先在原链表中找最小的,找到一个后就把它放到另一个空的链表中;

2、空链表中安放第一个进来的节点,产生一个有序链表,并且让它在原链表中分离出来(此时要注意原链表中出来的是第一个节点还是中间其它节点);

3、继续在原链表中找下一个最小的,找到后把它放入有序链表的尾指针的next,然后它变成其尾指针;

*/

struct student *SelectSort(struct student *head)

{

struct student *first; /*排列后有序链的表头指针*/

struct student *tail; /*排列后有序链的表尾指针*/

struct student *p_min; /*保留键值更小的节点的前驱节点的指针*/

struct student *min; /*存储最小节点*/

struct student *p; /*当前比较的节点*/

first = NULL;

while (head != NULL) /*在链表中找键值最小的节点。*/

{

/*注意:这里for语句就是体现选择排序思想的地方*/

for (p=head,min=head; p-next!=NULL; p=p-next) /*循环遍历链表中的节点,找出此时最小的节点。*/

{

if (p-next-num min-num) /*找到一个比当前min小的节点。*/

{

p_min = p; /*保存找到节点的前驱节点:显然p-next的前驱节点是p。*/

min = p-next; /*保存键值更小的节点。*/

}

}

/*上面for语句结束后,就要做两件事;一是把它放入有序链表中;二是根据相应的条件判断,安排它离开原来的链表。*/

/*第一件事*/

if (first == NULL) /*如果有序链表目前还是一个空链表*/

{

first = min; /*第一次找到键值最小的节点。*/

tail = min; /*注意:尾指针让它指向最后的一个节点。*/

}

else /*有序链表中已经有节点*/

{

tail-next = min; /*把刚找到的最小节点放到最后,即让尾指针的next指向它。*/

tail = min; /*尾指针也要指向它。*/

}

/*第二件事*/

if (min == head) /*如果找到的最小节点就是第一个节点*/

{

head = head-next; /*显然让head指向原head-next,即第二个节点,就OK*/

}

else /*如果不是第一个节点*/

{

p_min-next = min-next; /*前次最小节点的next指向当前min的next,这样就让min离开了原链表。*/

}

}

if (first != NULL) /*循环结束得到有序链表first*/

{

tail-next = NULL; /*单向链表的最后一个节点的next应该指向NULL*/

}

head = first;

return head;

}

/*

==========================

功能:直接插入排序(由小到大)

返回:指向链表表头的指针

==========================

*/

/*

直接插入排序的基本思想就是假设链表的前面n-1个节点是已经按键值

(就是用它排序的字段,我们取学号num为键值)排好序的,对于节点n在

这个序列中找插入位置,使得n插入后新序列仍然有序。按照这种思想,依次

对链表从头到尾执行一遍,就可以使无序链表变为有序链表。

单向链表的直接插入排序图示:

—-[1]—-[3]—-[2]…—-[n]—-[NULL](原链表)

head 1-next 3-next 2-next n-next

—-[1]—-[NULL](从原链表中取第1个节点作为只有一个节点的有序链表)

head

图11

—-[3]—-[2]…—-[n]—-[NULL](原链表剩下用于直接插入排序的节点)

first 3-next 2-next n-next

图12

—-[1]—-[2]—-[3]…—-[n]—-[NULL](排序后链表)

head 1-next 2-next 3-next n-next

图13:有N个节点的链表直接插入排序

1、先在原链表中以第一个节点为一个有序链表,其余节点为待定节点。

2、从图12链表中取节点,到图11链表中定位插入。

3、上面图示虽说画了两条链表,其实只有一条链表。在排序中,实质只增加了一个用于指向剩下需要排序节点的头指针first罢了。

这一点请读者务必搞清楚,要不然就可能认为它和上面的选择排序法一样了。

*/

struct student *InsertSort(struct student *head)

{

struct student *first; /*为原链表剩下用于直接插入排序的节点头指针*/

struct student *t; /*临时指针变量:插入节点*/

struct student *p; /*临时指针变量*/

struct student *q; /*临时指针变量*/

first = head-next; /*原链表剩下用于直接插入排序的节点链表:可根据图12来理解。*/

head-next = NULL; /*只含有一个节点的链表的有序链表:可根据图11来理解。*/

while (first != NULL) /*遍历剩下无序的链表*/

{

/*注意:这里for语句就是体现直接插入排序思想的地方*/

for (t=first, q=head; ((q!=NULL) (q-num t-num)); p=q, q=q-next); /*无序节点在有序链表中找插入的位置*/

/*退出for循环,就是找到了插入的位置*/

/*注意:按道理来说,这句话可以放到下面注释了的那个位置也应该对的,但是就是不能。原因:你若理解了上面的第3条,就知道了。*/

first = first-next; /*无序链表中的节点离开,以便它插入到有序链表中。*/

if (q == head) /*插在第一个节点之前*/

{

head = t;

}

else /*p是q的前驱*/

{

p-next = t;

}

t-next = q; /*完成插入动作*/

/*first = first-next;*/

}

return head;

}

/*

==========================

功能:冒泡排序(由小到大)

返回:指向链表表头的指针

==========================

*/

/*

冒泡排序的基本思想就是对当前还未排好序的范围内的全部节点,

自上而下对相邻的两个节点依次进行比较和调整,让键值(就是用它排

序的字段,我们取学号num为键值)较大的节点往下沉,键值较小的往

上冒。即:每当两相邻的节点比较后发现它们的排序与排序要求相反时,

就将它们互换。

单向链表的冒泡排序图示:

—-[1]—-[3]—-[2]…—-[n]—-[NULL](原链表)

head 1-next 3-next 2-next n-next

—-[1]—-[2]—-[3]…—-[n]—-[NULL](排序后链表)

head 1-next 2-next 3-next n-next

图14:有N个节点的链表冒泡排序

任意两个相邻节点p、q位置互换图示:

假设p1-next指向p,那么显然p1-next-next就指向q,

p1-next-next-next就指向q的后继节点,我们用p2保存

p1-next-next指针。即:p2=p1-next-next,则有:

[ ]—-[p]———-[q]—-[ ](排序前)

p1-next p1-next-next p2-next

图15

[ ]—-[q]———-[p]—-[ ](排序后)

图16

1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1-next-next;

2、顺着这一步一步往下推,排序后图16中p1-next-next要指的是p2-next,所以p1-next-next=p2-next;

3、在图15中p2-next原是q发出来的指向,排序后图16中q的指向要变为指向p的,而原来p1-next是指向p的,所以p2-next=p1-next;

4、在图15中p1-next原是指向p的,排序后图16中p1-next要指向q,原来p1-next-next(即p2)是指向q的,所以p1-next=p2;

5、至此,我们完成了相邻两节点的顺序交换。

6、下面的程序描述改进了一点就是记录了每次最后一次节点下沉的位置,这样我们不必每次都从头到尾的扫描,只需要扫描到记录点为止。

因为后面的都已经是排好序的了。

*/

struct student *BubbleSort(struct student *head)

{

struct student *endpt; /*控制循环比较*/

struct student *p; /*临时指针变量*/

struct student *p1;

struct student *p2;

p1 = (struct student *)malloc(LEN);

p1-next = head; /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/

head = p1; /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/

for (endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/

{

for (p=p1=head; p1-next-next!=endpt; p1=p1-next)

{

if (p1-next-num p1-next-next-num) /*如果前面的节点键值比后面节点的键值大,则交换*/

{

p2 = p1-next-next; /*结合第1点理解*/

p1-next-next = p2-next; /*结合第2点理解*/

p2-next = p1-next; /*结合第3点理解*/

p1-next = p2; /*结合第4点理解*/

p = p1-next-next; /*结合第6点理解*/

}

}

}

p1 = head; /*把p1的信息去掉*/

head = head-next; /*让head指向排序后的第一个节点*/

free(p1); /*释放p1*/

p1 = NULL; /*p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量*/

return head;

}

/*

==========================

功能:插入有序链表的某个节点的后面(从小到大)

返回:指向链表表头的指针

==========================

*/

/*

有序链表插入节点示意图:

—-[NULL](空有序链表)

head

图18:空有序链表(空有序链表好解决,直接让head指向它就是了。)

以下讨论不为空的有序链表。

—-[1]—-[2]—-[3]…—-[n]—-[NULL](有序链表)

head 1-next 2-next 3-next n-next

图18:有N个节点的有序链表

插入node节点的位置有两种情况:一是第一个节点前,二是其它节点前或后。

—-[node]—-[1]—-[2]—-[3]…—-[n]—-[NULL]

head node-next 1-next 2-next 3-next n-next

图19:node节点插在第一个节点前

—-[1]—-[2]—-[3]…—-[node]…—-[n]—-[NULL]

head 1-next 2-next 3-next node-next n-next

图20:node节点插在其它节点后

*/

struct student *SortInsert(struct student *head, struct student *node)

{

struct student *p; /*p保存当前需要检查的节点的地址*/

struct student *t; /*临时指针变量*/

if (head == NULL) /*处理空的有序链表*/

{

head = node;

node-next = NULL;

n += 1; /*插入完毕,节点总数加1*/

return head;

}

p = head; /*有序链表不为空*/

while (p-num node-num p != NULL) /*p指向的节点的学号比插入节点的学号小,并且它不等于NULL*/

{

t = p; /*保存当前节点的前驱,以便后面判断后处理*/

p = p-next; /*后移一个节点*/

}

if (p == head) /*刚好插入第一个节点之前*/

{

node-next = p;

head = node;

}

else /*插入其它节点之后*/

{

t-next = node; /*把node节点加进去*/

node-next = p;

}

n += 1; /*插入完毕,节点总数加1*/

return head;

}

/*

测试代码如下:

*/

/*测试SelectSort():请编译时去掉注释块*/

/*

head = SelectSort(head);

Print(head);

*/

/*测试InsertSort():请编译时去掉注释块*/

/*

head = InsertSort(head);

Print(head);

*/

/*测试BubbleSort():请编译时去掉注释块*/

/*

head = BubbleSort(head);

Print(head);

*/

/*测试SortInsert():上面创建链表,输入节点时请注意学号num从小到大的顺序。请编译时去掉注释块*/

/*

stu = (struct student *)malloc(LEN);

printf(“\nPlease input insert node — num,score: “);

scanf(“%ld,%f”,stu-num,stu-score);

head = SortInsert(head,stu);

free(stu);

stu = NULL;

Print(head);

*/

本文来自CSDN博客,转载请标明出处:

直接插入排序链表c语言代码(链表选择排序c语言)

C语言链表插入排序问题

//修改如下

#include

stdio.h

#include

stdlib.h

typedef

struct

node

{

int

xh;

char

sname[8];

int

sx;

int

yw;

int

zf;

int

mc;

struct

node

*next;

}linklist;

void

main()

{

linklist

*head;

linklist

*s=NULL;

//创建

链表时所用的指针。。

linklist

*p=NULL;//

输出

链表时所用的指针。。

linklist

*q=NULL;

linklist

*g=NULL;

char

ch;

head

=

NULL;//开始时

链表的头为空;

printf(“

输入

y

进入循环\n”);

scanf(“%c”,ch);

while(ch

==’y’||ch==’Y’)

{

s=(linklist*)malloc(sizeof(linklist));//给链表建立个空间

printf(“输入学号”);

scanf(“%d”,s-xh);

printf(“输入姓名”);

scanf(“%s”,s-sname);

printf(“输入数学成绩”);

scanf(“%d”,s-sx);

printf(“输入语文成绩”);

scanf(“%d”,s-yw);

s-zf=s-sx+s-yw;

s-next

=

NULL;

if(head

==

NULL||head-zfs-zf)

{

s-next=head;

head=s;

}

else

{

p=head;

q=p-next;

while(q!=NULLs-zf

=

q-zf)

{

p=q;

q=q-next;

}

s-next=q;

p-next=s;

}

getchar();//修改

printf(“

继续输入按y\n”);//修改

scanf(“%c”,ch);

}

//输出链表

g=head;

while(g!=NULL)

{

printf(“%4d”,g-xh);

printf(“%4s”,g-sname);

printf(“%4d”,g-sx);

printf(“%4d”,g-yw);

printf(“%4d”,g-zf);

printf(“\n

“);

g=g-next;//修改

}

}

用C语言编写一个算法,实现有序链表的插入。链表有序且不允许有重复元素?

如代码所示,c++语言,设带头节点的单链表L是一个递增有序表,试写一个函数,将x插入L中,并使L仍是一个有序表。望采纳!

关于直接插入排序链表c语言代码和链表选择排序c语言的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月30日 23:37:16
下一篇 2024年3月30日 23:46:39

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3300
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5000
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    3800
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    3800
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    6800
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    5900
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    3900
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4300
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3000
  • 黑客代码软件学习推荐歌曲的简单介绍

    我想自学编程代码,,目地是“黑”网站,开发出破解代码。有没有这方面的… 这个迭代周期不应该以周为周期或以月为周期发生,而是应该以日为周期。知识等待使用的时间越久,知识这把斧头就越钝。等待学习新知识的时间越长,你就越难以将其融入到代码中。 我认为这个问题问得本身就显得有点矛盾,想学却担心自己看不懂代码学不来,试问哪个编程人员不是从零开始的。坚定信念…

    2024年5月23日
    4100

发表回复

登录后才能评论



关注微信