第1章第2节练习题12 单链表之插入排序
来源:互联网 发布:c语言疯狂讲义 v4.0 编辑:程序博客网 时间:2024/04/27 13:31
问题描述
有一个带头结点的单链表对其排序,使之递增有序。
算法思想
本题是仅仅要求完成排序,因此我们很容易的想到使用插入排序算法完成单链表的排序。
首先将单链表的头结点拆下,用指针p指向剩余的不带头结点的那部分链表的的第一个结点,指针q指向指针p指向的结点的下一个结点。然后将指针p指向的结点摘下,使用指针pre对带有头结点的那部分链表进行遍历,如果指针pre所指结点的下一个结点的数据域值比指针p所指结点的数据域的值大,则将指针p所指结点插入到指针pre所指结点的后面,这样便完成了一次排序过程。重新让指针p指向不带头节点的那部分链表的第一个结点,指针q指向指针p所指结点的下一个结点,重新开始一次排序。
如图所示:
算法描述
void Sort(LNode *head){ LNode *pre=head; LNode *p=pre->next; LNode *q=p->next; p->next=NULL; p=q; while(q){ q=p->next; pre=head; while(pre->next!=NULL&&pre->next->data<p->data){ pre=pre->next; } p->next=pre->next; pre->next=p; p=q; }}
具体代码见附件
附件
#include<stdio.h>#include<stdlib.h>typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;LinkList CreatList(LNode*);void Sort(LNode*);void Print(LNode*);int main(int argc, char* argv[]){ LNode *head; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL; head=CreatList(head); Print(head); Sort(head); Print(head); return 0;}//头插法创建单链表LinkList CreatList(LNode* head){ LNode *L; ElemType x; scanf("%d",&x); while(x!=999){ L=(LNode*)malloc(sizeof(LNode)); L->data=x; L->next=head->next; head->next=L; scanf("%d",&x); } return head;}//直接插入排序void Sort(LNode *head){ LNode *pre=head; LNode *p=pre->next; LNode *q=p->next; p->next=NULL; p=q; while(q){ q=p->next; pre=head; while(pre->next!=NULL&&pre->next->data<p->data){ pre=pre->next; } p->next=pre->next; pre->next=p; p=q; }}//打印全部结点void Print(LNode *head){ LNode *p=head->next; while(p){ printf("%4d",p->data); p=p->next; } printf("\n");}
0 0
- 第1章第2节练习题12 单链表之插入排序
- 第1章第2节练习题13 单链表之选择排序
- 第1章第2节练习题22 按结点访问频度排序
- 第2章练习题1
- 第1章第2节练习题6 反向输出
- 第1章第2节练习题7 递减输出
- 第1章第2节练习题11 就地逆置单链表
- 【牛客网】直通bat-面试算法精品课_第2章 排序 2.4 插入排序练习题(JAVA版)
- 第2章练习题
- 第1章练习题
- 第1章第2节练习题8 奇偶拆分单链表
- 第1章第2节练习题15 拆分并逆序单链表
- 第1章第2节练习题16 归并并逆序单链表
- 第1章第2节练习题18 求两个单链表的交集
- 第1章第2节练习题20 连接两个循环单链表
- JSP 第1、2章 练习题
- 第1章第1节练习题1 删除最小值
- 第1章第1节练习题10 查找中位数
- contiki 中数据包的接收与发送流程
- 使用multi curl进行http并发访问 (转)
- GetAlternatePathName
- java的值传递与引用传递
- vs2010配备boost编程环境
- 第1章第2节练习题12 单链表之插入排序
- 关于Android弹出输入法后页面需要上移的问题。
- 工程师应该怎样选择Arduino开发板
- 【主席树】POJ 2014 K-th Number
- qt 版本和linux下字符编码问题
- 华为机试——字符串中出现次数最多的子串
- 用InterfaceBuilder构造一个App 、 视图控制器和视图 、 控件与事件
- OM:Over-ship Tolerance
- layer动画(二)