创建带表头的单链表,编写程序实现将单链表排序成为有序单链表的操作。
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct node{
int element;//数据,类型设为整型
struct node *link;//指针
}Node;//创建节点格式
typedef struct headerList{
Node *head;//头指针
int n;//链表的元素个数
}HeaderList;//创建单链表格式
void main()
{
int i;
HeaderList list;//定义一个单链表
Init(&list);//初始化单链表
for(i=0;i<9;i++)
Insert(&list,i-1);
printf("\n当前单链表为:");
Output(&list);
Order(&list);
printf("\n排序后,当前单链表为:");
Output(&list);
Destroy(&list);
}
//初始化
Status Init(HeaderList *h)
{
h->head=(Node*)malloc(sizeof(Node));//生成表头结点
if(!h->head)
return ERROR;
h->head->link=NULL;
h->n=0;
return OK;
}
//插入
Status Insert(HeaderList *h,int i)
{
Node *p,*q;//结点指针
int x;
int j;
if(i<-1||i>h->n-1)
return ERROR;
p=h->head;
for(j=0;j<=i;j++)
p=p->link;//p还在上次位置,这次给他移到单数第一个结点
q=(Node*)malloc(sizeof(Node));//创建一个新节点
printf("请输入要插入的元素:");
scanf("%d",&x);
q->element=x;
q->link=p->link;
p->link=q;
h->n++;//链表长度加一
return OK;
}
//排序
Status Order(HeaderList *h)
{
Node *q,*p,*m,*s1,*s2;
//q:指向排序好后的最后位置;m:确定最小元素min;p:向后探索最小元素;
//s1:m指针的前一个结点;s2:p指针的前一个结点
q=h->head;
while(q->link->link)
{
s1=q;
s2=q;
m=q->link;
p=q->link;
//在单链表中找出最小的元素
while(p)
{
if(m->element>=p->element)//如果m的元素大于p的元素,则m指向p
{
s1=s2;
m=p;
}
s2=p;
p=p->link;
}
//改变结点顺序
s1->link=m->link;
m->link=q->link;
q->link=m;
q=m;
}
return OK;
}