/**************************************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 9
link* 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;
}
C实现的循环链表排序
最新推荐文章于 2022-08-14 09:04:23 发布