主题:给几个单链表排序的算法函数!
ilovepc
[专家分:50] 发布于 2006-06-21 10:25:00
大家给几个单链表排序的函数,
谢谢了
单链表类型定义
typedef struct node{
int data;
struct node *next;
}lnode,*linklist;
直接插入排序单链表的不会做
希望大家给点提示
最好写出实现排序的函数
回复列表 (共4个回复)
沙发
goal00001111 [专家分:4030] 发布于 2006-06-21 20:49:00
可以考虑插入法排序.
板凳
goal00001111 [专家分:4030] 发布于 2006-06-21 22:31:00
/*单链表排序*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}lnode,*linklist;
linklist InsertSort(linklist h)//注意要设置一个头结点,以方便寻找和插入元素
{
linklist th = h; //指向当前被插入位置的前驱
linklist pre; //指向当前最小值(被插入的元素)的前驱
linklist p; //指向当前最小值
linklist r; //临时指针,用来寻找当前最小值
int min; //存储当前最小值
while (th->next != NULL)//遍历原单链表
{
p = r = th->next; //p,r开始指向当前被插入位置
min = r->data;
while (r != NULL) //遍历链表,寻找当前最小值
{
if (r->data < min)
{
min = r->data; //存储当前最小值
p = r; //指向当前最小值
}
r = r->next;
}
pre = th;
while (pre->next != p) //寻找当前最小值的前驱,并用pre指向它
pre = pre->next;
//把p插入到th的后面
if (th->next != p)
{
pre->next = p->next;
p->next = th->next;
th->next = p;
}
th = th->next;
}
return h;//返回头指针
}
//////////////////////测试函数////////////////////////////
void Print(linklist h);
linklist CreateList(int a[], int len);//用来构造一个链表
void ListInsert(linklist h, int x);//构造一个数据域为X的新结点
int main()
{
linklist head;
int a[5]={3,2,1,48,5};
head = CreateList(a, 5);
Print(head);
head = InsertSort(head);
Print(head);
getchar();
return 0;
}
void Print(linklist h)
{
linklist p = h->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
linklist CreateList(int a[], int len)//用来构造一个链表
{
linklist Head;
int i;
Head = (linklist)malloc(sizeof(lnode)); //为链表的头结点分配空间
if(!Head)
{
printf("Out of space!");
return NULL;
}
Head->next = NULL;
for(i=0; i<len; i++)
{
ListInsert(Head, a[i]); //把新结点S插到头结点后面。
}
return Head;
}
void ListInsert(linklist h, int x)//构造一个数据域为X的新结点
{
linklist S;
S = (linklist)malloc(sizeof(lnode));//为新结点分配空间
if(!S)
{
printf("Out of space!");
exit(1);
}
S->data = x;
S->next = h->next;
h->next = S;
}
3 楼
goal00001111 [专家分:4030] 发布于 2006-06-22 08:26:00
再给你一个,这个原链表不带头结点的.
/*单链表排序*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}lnode, *linklist;
linklist Sort(linklist h)
{
linklist Head;/*建立一个头结点*/
linklist p, q, r, s;
p = Head = (linklist)malloc(sizeof(lnode)); //为链表的头结点分配空间
if(!Head)
{
printf("Out of space!");
return NULL;
}
p->next = h;
while (p->next != NULL)
{
q = p->next;
r = p;
while (q->next != NULL)
{
if (q->next->data < r->next->data)
r = q; //r指向当前最小值的前驱
q = q->next;
}
if (r != p) //若r!=p,把其后继(当前最小值)插入到p的后面
{
s = r->next;
r->next = s->next;
s->next = p->next;
p->next = s;
}
p = p->next; //指向当前被插入位置的前驱
}
h = Head->next;
free(Head);
return h;
}
//////////////////////测试函数////////////////////////////
linklist Create(int a[], int n);
int main()
{
linklist head, p;
int a[5]={3,2,1,48,5};
head = Create(a, 5);
printf("before arrange:\n");
for (p=head; p; p=p->next)
printf("%d ", p->data);
printf("\n");
head = Sort(head);
printf("after arrange:\n");
for (p=head; p; p=p->next)
printf("%d ", p->data);
printf("\n");
getchar();
return 0;
}
linklist Create(int a[], int n)/*建立一个单链表*/
{
linklist h, s;
for (h=NULL; n; n--)
{
s = (linklist)malloc(sizeof(lnode));//为新结点分配空间
if(!s)
{
printf("Out of space!");
exit(1);
}
s->data = a[n-1];
s->next = h;
h = s;
}
return h;
}
4 楼
ilovepc [专家分:50] 发布于 2006-06-22 16:25:00
谢谢了
今后还得多多指教!
我来回复