
稍微看了一下,感觉你思路有点混乱
链表 *** 作其实很简单,就是三种 *** 作吧,建立链表,插入节点,删除节点
你可以这么理解链表,就是一串珠子,节点就是珠子,二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语言直接插入排序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)