C实现的循环链表排序

来源:互联网 发布:用dwcs5制作淘宝 编辑:程序博客网 时间:2024/06/12 01:11
/**************************************loop link***********************************//**********************************author:zhangyong*******************************//***********************************language:C************************************/#include <stdio.h>#include <stdlib.h>typedef struct _link{    int data;struct _link *rlink,*link;}link;int Data[8]={23,20,78,56,47,100,456,9};// 45 23 78 56 47 100 456 9link* creatlink() //创建链表{link *h,*node,*newnode;int i;h=node= (link*)malloc(sizeof(link));    node->data = Data[0];node->rlink = NULL;node->link = NULL;for( i=1;i<8;i++){newnode = (link*)malloc(sizeof(link));node->rlink = newnode;newnode->link = node;newnode->data = Data[i];node = newnode;}newnode->rlink = h;h->link = newnode;return h;}void dele(int data,link* head)//删除data结点{int i;if(data == Data[0]){head->link->rlink = head->rlink;head->rlink->link = head->link;free(head);}for(i=1;i<8;i++){head =head->rlink;if(data == Data[i]){head->link->rlink = head->rlink;head->rlink->link = head->link;free(head);break;}}}link* add(int data,link *head)  //在头部添加节点{link *p;p = (link*)malloc(sizeof(link));p->data= data;p->rlink = head;p->link = head->link;head->link->rlink = p;head->link = p;return p;}link * sort(link* head)  //对循环链表的数据进行排序 使用冒泡排序{    link *q,*p,*t,*s;//*n;int i,j,k;    q = head;for(j=0;j<8;j++){p = q->rlink;for(i=0;i<7-j;i++)  //每次冒泡把一个最大值放到最后{if(p->data<q->data){t = q;s = p;t->link->rlink = p;p->link = t->link;s->rlink->link = q;q->rlink = s ->rlink ;p->rlink = q;q->link = p;//s->rlink->link = q;//q->rlink = s ->rlink ;//n = q;//head = p;p = p->rlink ->rlink ;}else{/*if(j==7){head = q;goto  HERE;}*/q=q->rlink;p= p->rlink;}}       if(j==7){head = q;goto  HERE;}for(k=0;k<=j;k++)q= q->rlink ;}//head = p;HERE:return head;  //返回最小值为头结点}void print(link* head) //打印链表{int i;for(i=0;i<8;i++){printf("%d\t",head->data);head = head->rlink;}}void clear(link* head)  //释放分配的内存{int i;link* q;for(i=0;i<8;i++){q = head->rlink;free(head);head =q;}}int main(){link* head=NULL;//head = (link*)malloc(sizeof(link));head = creatlink();dele(20,head);head = add(45,head);head = sort(head);print(head);clear(head);    return 0;}