带头结点的单链表实现冒泡排序

单链表实现整型数据冒泡排序

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Node
{
	ElemType data;
	struct Node *next;
}LinkList;

//创建带头结点的单链表(尾插法)
LinkList * CreateList(int *arr,int length)  //通过数组来传递数据
{
	LinkList *p,*head=NULL,*tail=NULL;
	head=(LinkList *)malloc(sizeof(LinkList));
	head->next=NULL;
	tail=head;
	for(int i=0;i<length;i++)
		{
			p=(LinkList *)malloc(sizeof(LinkList));
			tail->next=p;
			p->data=arr[i];
			p->next=NULL;
			tail=p;
		}
	return head;  //返回头指针
}

//冒泡排序算法
void BubbleSort(LinkList *head)
{
    LinkList *p, *q, *tail;    //tail作为每趟比较的截止标志
    tail = NULL;
    while((head->next->next)!=tail)
    {
        p = head;              //p指向要进行比较的结点的前一个结点,对其初始化,是比较从头开始进行
        q = head->next;        //q指向要进行比较的结点,对其初始化,是比较从头开始进行
        while(q->next != tail)
        {
            if((q->data) > (q->next->data))      //将两个指针结点位置进行交换
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q;
                q = p->next;
            }
            q = q->next;
            p = p->next;
        }
        tail = q;
    }
}
//打印结果
void Display(LinkList *L)
{
	LinkList *p;
	p=L->next;
	while(p)
	{
		printf("%d\t",p->data);
		p=p->next;
	}
}

int main()
{
	int arr[]={6,21,34,5,35};
	LinkList *L;
	L=CreateList(arr,sizeof(arr)/sizeof(arr[0]));
	printf("\n排序前序列为:\n");
	Display(L);
	printf("\n");
	BubbleSort(L);
	printf("\n排序后的序列为:\n");
	Display(L);
	printf("\n\n");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值