单链表的冒泡排序以及逆序(交换指针法)
来源:互联网 发布:美国动画产业 知乎 编辑:程序博客网 时间:2024/06/16 04:35
#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;
}
- 单链表的冒泡排序以及逆序(交换指针法)
- 178_冒泡排序的交换次数(逆序数)
- 冒泡排序-指针交换
- 冒泡排序(优化版)的比较次数和交换数字次数 逆序数+树状数组
- 排序算法---之交换排序(冒泡排序&快速排序-左右指针法,挖坑法,前后指针法)
- 冒泡排序以及两个数之间的交换
- 链表的冒泡排序(节点交换法)
- [Java]交换排序法(冒泡、快速)的简单说明
- 交换排序(冒泡排序)
- // 冒泡排序法 (比较,交换)
- 冒泡排序的交换次数,即数组逆序对的求解
- P279_1012 用了典型的冒泡法对字符串排序。侧重指针应用,交换指针所指向的地址。
- 冒泡法排序(指针)
- 冒泡排序的交换次数
- 冒泡排序的交换次数
- 数据结构-排序: 交换排序(冒泡排序法)
- 数据结构-排序: 交换排序(冒泡排序法)
- 交换排序(冒泡排序、快速排序)
- springmvc中forward和redirect
- asp.net 捕获用户操作 确认删除
- c代码处理
- 多条件筛选界面DropDownMenu使用总结
- 争取做一个早睡早起,有思想也有的趣程序员
- 单链表的冒泡排序以及逆序(交换指针法)
- consul部署 docker篇
- HDU_1009 FatMouse' Trade 【贪心】
- ubuntu16.04中将python3设置为默认
- CSS:z-index
- 简单排序包括冒泡排序和插入排序
- 考研英语
- 技术性图文还原那些腿长得能改变地球引力场的TB奇女子
- 希尔排序(增量排序)