关于C语言插入和排序的问题

关于C语言插入和排序的问题,第1张

稍微看了一下,感觉你思路有点混乱

链表 *** 作其实很简单,就是三种 *** 作吧,建立链表,插入节点,删除节点

你可以这么理解链表,就是一串珠子,节点就是珠子,二next指针就是穿珠子的线

建立链表,一般就是几部

1、申请一个空间,p=(Student)malloc(sizeof(Student));

2、让这个节点的next为空,最好接着申请空间做。p->next=NULL;

3、输入数据,这个不用多说

4、把新节点连接到链表的最后,这里要有一个q指针(一般程序都是这个指针变量名)指向这个链表的最后一个节点,不过这里需要判断是否是第一个节点

如果是第一个建立的节点,要head(一般链表的头节点都用这个单词做头节点的指针)指向这个节点,head=p

不是第一个节点,让p节点连接到这个链表上,q->next=p

5、把q节点移动到最后,也就是指向这个新的节点,q=p

节点的建立就这么几步,理解了很简单

插入节点,这里算是三步吧

1、申请一个空间,p=(Student)malloc(sizeof(Student));

2、让这个节点接到后面,p->next=q->next。这里假设在q节点后面插入。

在一个节点的前面是无法插入的,因为你无法用后面的节点来找到前面节点的指针,除非是双向链表

3、连接到前面q->next=p

这样p接到q的后一个节点上,q接到p上。这里顺序不能反了,要不然你就找不到q后一个节点的指针了(q后一个节点指针存放在next中)。先接到q上,那么next这个指针就变了,找不到后面节点指针

删除最简单,只要一句

p->next=p->next->next搞定,就是把p后面那个节点的next直接赋值到p的next即可

双向链表麻烦一点,只要你理解了单项链表,也不是很难

#include <stdioh>

int main(){

int number[10] = {95, 45, 15, 78, 84, 51, 24, 12,34,23};

for (int j = 0; j < 9; j++)

for (int i = 0; i < 9 - j; i++)  {

if(a[i] > a[i + 1])    {

                  int temp = a[i];

a[i] = a[i + 1];

a[i + 1] = temp;  }

}

for (int i = 0; i < 10; i++)  {

printf(“%d”,a[i]);     }

}

扩展资料:

常见排序算法

快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

插入排序

已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。

首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。

b[2]~b[m]用相同方法插入。

快速排序

快速排序是大家已知的常用排序算法中最快的排序方法。已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。

比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。

希尔排序

已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。

首先取一增量d(d<n),将a[1]、a[1+d]、a[1+2d]……列为第一组,a[2]、a[2+d]、a[2+2d]……列为第二组……,a[d]、a[2d]、a[3d]……列为最后一组以次类推,在各组内用插入排序,然后取d'<d,重复上述 *** 作,直到d=1。

参考资料:

排序-百度百科

插入排序就类似摸牌理牌的过程。每摸一个数,将其插入前面已排好的序列中。用数组实现即可。

下面我写出主要代码:

for(i=2;i<=N;i++) //这里我不用数组零空间,用来插的数据,插完第二个接着插第三个

{ //第一个数本来就有序,所以不用插了

key=a[i]; //把要插的数先保存起来,因为待会儿你插在前面时,元素要后移,会将其覆盖

for(j=i-1;j>0;j--) //你插第i个元素,说明前1到i-1个元素都排好了。

{

if(key>a[j]) //从有序序列中最后的元素比较,这里我用从小到大排序

{ //上面说明插入位置应该是第j+1个。

for(k=i-1;k>=j-1;k--) //后移 *** 作。

a[k+1]=a[k];

}

a[j+1]=key; //插入

}

上面是基本思想,更标准的代码,你可以百度查查。

#include <stdioh>

#include "4-1 CreateDatac" //生成随机数的函数

#define ARRAYLEN 10 //需要排序的数据元素数量

void InserSort(int a[],int n)//直接插入排序

{

int i,j,t;

for(i=1;i<n;i++)

{

t=a[i]; //取出一个未排序的数据

for(j=i-1;j>=0 && t<a[j];--j) //在排序序列中查找位置

a[j+1]=a[j]; //向后移动数据

a[j+1]=t; //插入数据到序列

}

}

int main()

{

int i,a[ARRAYLEN]; //定义数组

for(i=0;i<ARRAYLEN;i++) //清空数组

a[i]=0;

if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功

{

printf("生成随机数不成功!\n");

getch();

return 1;

}

printf("原数据:"); //输出生成的随机数

for(i=0;i<ARRAYLEN;i++)

printf("%d ",a[i]);

printf("\n");

InserSort(a,ARRAYLEN); //调用插入排序函数

printf("排序后:");

for(i=0;i<ARRAYLEN;i++) //输出排序后的结果

printf("%d ",a[i]);

printf("\n");

getch();

return 0;

}

主要是看懂这个函数 void InserSort(int a[],int n)

以上就是关于关于C语言插入和排序的问题全部的内容,包括:关于C语言插入和排序的问题、c语言编程:对10个数冒泡排序(升序)。、数据结构c语言直接插入排序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10060438.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存