#include<stdio.h>
#include<stdlib.h>
// 链表结构体
typedef struct _Node
{
int data;// 数据域
struct _Node *next;//指针域
}Node, *LinkList;
// 头插法建表
void InsertHead(LinkList *pHead, int value)
{
LinkList pNew = (LinkList)malloc(sizeof(Node));
if (NULL == pNew)
{
printf("动态申请内存失败!\n");
}
pNew->data = value;
pNew->next = *pHead;
*pHead = pNew;
}
// 尾插法建表
void DelTail(LinkList *pHead)
{
while (NULL != *pHead)
{
LinkList temp = *pHead;
(*pHead) = temp->next;
free(temp);
temp = NULL;
}
}
// 显示函数
void Show(LinkList pHead)
{
while (NULL != pHead)
{
printf("%d ", pHead->data);
pHead = pHead->next;
}
printf("\n");
}
// 获取链表长度
int GetLength(LinkList pHead)
{
int count = 0;
while (NULL != pHead)
{
count++;
pHead = pHead->next;
}
return count;
}
// 单链表冒泡排序
void BubleSort(LinkList *pHead)
{
int i;
LinkList pCur = NULL;
LinkList pNext = NULL;
LinkList ppHead = NULL;
int len = GetLength(*pHead);
// 前插一个头节点
InsertHead(pHead,0);
for (i = 0; i < len-1; i++)
{
for (ppHead = *pHead; pCur =ppHead->next, pNext = pCur->next, pNext!=NULL;)
{
if (pCur->data>pNext->data)
{
pCur->next = pNext->next;
pNext->next = pCur;
ppHead->next = pNext;
ppHead = ppHead->next;
pNext = pCur->next;
}
else
{
ppHead = ppHead->next;
pCur = pCur->next;
pNext = pNext->next;
}
}
}
// 删除头节点
LinkList temp = (*pHead);
*pHead = temp->next;
free(temp);
temp = NULL;
}
// 单链表逆序
void Reverse(LinkList *pHead)
{
int i;
int len = GetLength(*pHead); // 获取链表的长度
// 前插一个头节点
InsertHead(pHead, 0);
LinkList pCur = (*pHead)->next;
for (i = 0; i < len - 1; i++)
{
LinkList pNext = pCur->next;
LinkList ppNext = pNext->next;
LinkList temp = NULL;
if (pNext== NULL)
{
break;
}
else
{
// temp = pCur;
pNext->next = (*pHead)->next;
pCur->next = ppNext;
(*pHead)->next = pNext;
}
}
// 删除头节点
LinkList temp = (*pHead);
*pHead = temp->next;
free(temp);
temp = NULL;
}
int main(void)
{
int i;
LinkList pHead = NULL;
for (i = 0; i < 10; i++)
{
InsertHead(&pHead, i + 1);
}
printf("建完表后各个节点的数据为:\n");
Show(pHead);
printf("\n链表的长度为:\n%d\n", GetLength(pHead));
BubleSort(&pHead);
printf("冒泡排序后的顺序为:\n");
Show(pHead);
printf("逆序后的顺序为:\n");
Reverse(&pHead);
Show(pHead);
DelTail(&pHead);
return 0;
}
单链表的冒泡排序以及逆序(交换指针法)
最新推荐文章于 2020-10-25 17:05:04 发布
一直苦于单链表进行排序操作,在博客上看到好多的链表排序都是以值交换为主,实在是很难受。自己有一个需求就是写一个单链表的冒泡排序和逆序。然后自己也写了值交换法的单链表冒泡排序和逆序,希望能对需要帮助的朋友产生一些启发,当然本人的水平有限,写的不好,请大家指导。