用双向链表对整形数据进行排序
2011-07-11 10:42
288 查看
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
typedef struct node
{
struct node *prev;
struct node *next;
int Data;
}link,*pLink;
pLink InitLink();
pLink GetTail(pLink head,int num);
void PrintLink(pLink head);
void SortLink(pLink head,pLink tail);
int LinkNum(pLink head);
int main()
{
pLink head,tail;
head = InitLink();
int num = 0;
num = LinkNum(head);
tail = GetTail(head,num);
SortLink(head,tail);
PrintLink(head);
}
pLink InitLink()
{
pLink head,p,n;
int x,cycle;
head = (pLink)malloc(sizeof(link));
p = head;
cycle = 1;
while(cycle)
{
printf("please enter data:\n");
scanf("%d",&x);
if(x != 0)
{
n = (pLink)malloc(sizeof(link));
n->Data = x;
p->next = n;
n->prev = p;
p = n;
}
else
{
cycle = 0;
}
}
head = head->next;
head->prev = NULL;
p->next = NULL;
return head;
}
void SortLink(pLink head,pLink tail)
{
pLink q,p,flag;
q = (pLink)malloc(sizeof(link));
p = (pLink)malloc(sizeof(link));
flag = (pLink)malloc(sizeof(link));
flag = head;
p = tail;
q = NULL;
int t;
while (flag != NULL)
{
flag = NULL;
for (q = head; q != p; q = q->next)
{
if ((q->Data) > (q->next->Data))
{
t = q->Data;
q->Data = q->next->Data;
q->next->Data = t;
flag = q;
}
}
p = flag;
}
}
int LinkNum(pLink head)
{
int sum = 0;
pLink p;
p = head;
while(p != NULL)
{
p = p->next;
sum++;
}
return sum;
}
pLink GetTail(pLink head,int num)
{
pLink p,q;
int sum = 0;
q = (pLink)malloc(sizeof(link));
p = (pLink)malloc(sizeof(link));
p = head;
while(p != NULL)
{
sum++;
p = p->next;
if(num-1 == sum)
{
return p;
}
}
}
void PrintLink(pLink node)
{
pLink q;
printf("Now the link: ");
do
{
q=node;
printf("%d ",node->Data);
node=node->next;
free(q);
}
while(node!=NULL);
getch();
}
初学咋练,多多指教
估计名字起得不是很合理,我后面会进行改写
#include"stdlib.h"
#include"conio.h"
typedef struct node
{
struct node *prev;
struct node *next;
int Data;
}link,*pLink;
pLink InitLink();
pLink GetTail(pLink head,int num);
void PrintLink(pLink head);
void SortLink(pLink head,pLink tail);
int LinkNum(pLink head);
int main()
{
pLink head,tail;
head = InitLink();
int num = 0;
num = LinkNum(head);
tail = GetTail(head,num);
SortLink(head,tail);
PrintLink(head);
}
pLink InitLink()
{
pLink head,p,n;
int x,cycle;
head = (pLink)malloc(sizeof(link));
p = head;
cycle = 1;
while(cycle)
{
printf("please enter data:\n");
scanf("%d",&x);
if(x != 0)
{
n = (pLink)malloc(sizeof(link));
n->Data = x;
p->next = n;
n->prev = p;
p = n;
}
else
{
cycle = 0;
}
}
head = head->next;
head->prev = NULL;
p->next = NULL;
return head;
}
void SortLink(pLink head,pLink tail)
{
pLink q,p,flag;
q = (pLink)malloc(sizeof(link));
p = (pLink)malloc(sizeof(link));
flag = (pLink)malloc(sizeof(link));
flag = head;
p = tail;
q = NULL;
int t;
while (flag != NULL)
{
flag = NULL;
for (q = head; q != p; q = q->next)
{
if ((q->Data) > (q->next->Data))
{
t = q->Data;
q->Data = q->next->Data;
q->next->Data = t;
flag = q;
}
}
p = flag;
}
}
int LinkNum(pLink head)
{
int sum = 0;
pLink p;
p = head;
while(p != NULL)
{
p = p->next;
sum++;
}
return sum;
}
pLink GetTail(pLink head,int num)
{
pLink p,q;
int sum = 0;
q = (pLink)malloc(sizeof(link));
p = (pLink)malloc(sizeof(link));
p = head;
while(p != NULL)
{
sum++;
p = p->next;
if(num-1 == sum)
{
return p;
}
}
}
void PrintLink(pLink node)
{
pLink q;
printf("Now the link: ");
do
{
q=node;
printf("%d ",node->Data);
node=node->next;
free(q);
}
while(node!=NULL);
getch();
}
初学咋练,多多指教
估计名字起得不是很合理,我后面会进行改写
相关文章推荐
- 编写一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整形,单精度,双精度。用重载函数实现
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构
- 对链表数据进行插入排序
- SDUT_2121数据结构实验之链表六:有序链表的建立 (对建立的单项链表结构进行排序)
- 数据结构——树——二叉查找树转换成排序的循环双向链表
- hadoop实战学习之用MapReduce简单对整形数据进行全局排序
- 用双向链表对字符串进行排序
- 将二叉搜索树转换成一个排序双向链表
- 程序员面试宝典之数据结构基础----④单链表排序(读后)
- 数据结构:链表 >> 链表按结点中第j个数据属性排序(冒泡排序法)
- 使用自定义Comparator对TreeSet中的数据进行多条件排序
- 使用Vegan包进行生态学数据排序分析的学习(一)
- asp.net中对DataTable数据进行排序、检索、合并、分页、统计
- NSArray 数据对象的多个条件进行排序
- MySQL中利用索引对数据进行排序的基础教程
- 把二元查找树转变成排序的双向链表
- 对JSONObject中的数据进行排序
- 数据结构课程设计-----用C#实现双向链表
- 对于一系列数据通过单击进行排序(每次只能单击一次)
- [程序员面试题精选100题(01)]-二叉查找树转成排序的双向链表