#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next; //指向后继结点
} LinkNode; //声明单链表结点类型
void CreateListF(LinkNode *&L,ElemType a[],int n)
//头插法建立单链表
{
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->next=NULL;
for (int i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
s->data=a[i];
s->next=L->next; //将结点s插在原开始结点之前,头结点之后
L->next=s;
}
}
void DispList(LinkNode *L)
{
LinkNode *p=L->next;
while (p!=NULL)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void DestroyList(LinkNode *&L)
{
LinkNode *pre=L,*p=pre->next;
while (p!=NULL)
{ free(pre);
pre=p;
p=pre->next;
}
free(pre); //此时p为NULL,pre指向尾结点,释放它
}
void sort(LinkNode *&L)
{ LinkNode *p,*pre,*q;
p=L->next->next; //p指向L的第2个数据结点
L->next->next=NULL; //构造只含一个数据结点的有序表
while (p!=NULL)
{
q=p->next; //q相当于循环语句中循环变量,循环一次指针往后移一次,有序表在增加
pre=L; //循环中pre=L,相当于每次排好一个数,pre指针要归位
while (pre->next!=NULL && pre->next->data<p->data)
pre=pre->next; //在有序表中找插入p结点的前驱结点pre
p->next=pre->next; //在pre结点之后插入p结点
pre->next=p;
p=q; //相当于p=p->next,继续寻找下一个结点
}
}
int main()
{
LinkNode *L;
int n=10;
ElemType a[]={1,3,2,9,0,4,7,6,5,8};
CreateListF(L,a,n);
printf("L:");DispList(L);
printf("排序\n");
sort(L);
printf("L:");DispList(L);
DestroyList(L);
return 1;
}
单链表递增排序算法
最新推荐文章于 2023-11-25 22:10:55 发布
这篇博客通过C语言展示了如何使用头插法创建单链表,并实现链表的排序。首先定义了链表节点结构体,然后通过CreateListF函数创建链表,用 DispList 函数打印链表,sort 函数进行链表排序,最后销毁链表。在main函数中,创建了一个包含10个元素的链表并进行升序排序,排序后再次打印链表。
2646

被折叠的 条评论
为什么被折叠?



