链表基本操作与排序(c语言)
本设计程序用C编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。实现三种排序算法-冒泡排序、快速排序、合并排序。产生四个长度为100,1000,10000,50000的随机数数组,分别用这三种排序算法对每个数组进行排序,并记录每种算法在排序所花费的计算机时间,并进行对比分析
① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。
② 输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③ 程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。
1.定义单链表结构
typedef struct Node
{
Item data;
struct Node *next;
}Node,*ListNode;
2.初始化单链表
ListNode InitLinkList(ListNode *List)
{
*List = (ListNode)malloc(sizeof(struct Node));
(*List)->next = NULL;
}
3.创建随机数的单链表
ListNode CreatListTail(int len)//len为单链表长度
{
int i;
ListNode p;
srand(time(0));//启动随机种子数
ListNode List = (ListNode)malloc(sizeof(struct Node));
ListNode Tail = List;
for(i = 0; i < len; i ++)
{
p = (ListNode)malloc(sizeof(struct Node));
p->data = rand() % len + 1;//产生随机数
Tail->next = p;
Tail = p;
}
Tail->next = NULL;
return List;
}
4.打印单链表
void dispLinkList( ListNode List)
{
int i=0;
while(List != NULL)
{
printf("%d ",List->data);
List = List->next;
i++;
}
printf("\n");
printf("总共%d个节点",i);
}
5.单链表的插入操作
void InsLinkList(ListNode List,int i,int e) //插入给i位置的元素为e
{
Node *pre,*s;
int k;
pre = List;
k=0;
while(pre !=NULL && k < i-1)
{
pre = pre->next;
k=k+1;
}
if(pre == NULL)
{
printf("插入位置不合理");
}
s=(ListNode)malloc(sizeof(struct Node));
s->data=e;
s->next=pre->next;
pre->next=s;
}
6.删除单链表的节点i
void DelLinkList(ListNode List,int i)//删除i位置元素,并将删除的元素保存到*e中
{
Node *pre,*r;
int k;
pre = List;
k=0;
while(pre !=NULL && k < i-1)
{
pre = pre->next;
k=k+1;
}
if(pre->next == NULL)
{
printf("删除节点不合理");
}
r=pre->next;
pre->next=r->next;
//*e = r->data;//并将删除的元素保存到*e中
free(r);
}
7.查找元素的位置
int LocLinkList(ListNode List,int e)//查找值为e的节点位置
{
Node *p ;
int i=1;
p = List->next;
while(p != NULL)
{
if(p->data != e)
{
p = p->next;
i++;}
else break;
}
return i;
}
8.对单链表进行归并排序
void Split_List(ListNode List, ListNode *List_A, ListNode *List_B)
{
ListNode fast_list;
ListNode low_list;
if(List == NULL || List->next == NULL)
{
*List_A = List;
*List_B = NULL;
}
else
{
low_list = List;
fast_list = List->next;
while(fast_list != NULL)
{
fast_list = fast_list->next;
if(fast_list != NULL)
{
low_list = low_list->next;
fast_list = fast_list->next;
}
}
*List_A = List;
*List_B = low_list->next;
low_list->next = NULL;
}
}
ListNode Merge_List(ListNode List_A, ListNode List_B)
{
ListNode List_Result = NULL;
if(List_A == NULL)
return List_B;
if(List_B == NULL)
return List_A;
if(List_A->data <= List_B->data)
{
List_Result = List_A;
List_A = List_A->next;
}
else
{
List_Result = List_B;
List_B = List_B->next;
}
List_Result->next = Merge_List(List_A,List_B);
return List_Result;
}
void Mergesort(ListNode *List)
{
ListNode Head = *List;
ListNode List_A;
ListNode List_B;
if(Head == NULL || Head->next == NULL)
return;
Split_List(Head, &List_A, &List_B);
Mergesort(&List_A);
Mergesort(&List_B);
*List = Merge_List(List_A,List_B);
}
9.对单链表进行冒泡排序
void BubbleSort(ListNode List)
{
Node * p, * q, * tail;
tail = NULL;
while((List->next->next) != tail)
{
p = List;
q = List->next;
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;
}
}
10.对单链表进行快速排序
void swap(int &a, int &b) //引用类型方式
{
int temp; //辅助变量
temp = a;
a = b;
b = temp;
}
void quickSort(Node* start, Node* end=NULL)
{
if (start == NULL || start == end) return;
Node* p1 = start;
Node* p2 = start->next;
while (p2 != end) {
if (p2->data < start->data) {
p1 = p1->next;
swap(p1->data, p2->data);
}
p2 = p2->next;
}
swap(p1->data, start->data);
quickSort(start, p1);
quickSort(p1->next, end);
}
位置下标从0开始
主函数:
int main()
{
clock_t start, finish;;//起始 结束时间
double duration;//总计时间
ListNode Head;
ListNode List;
printf("\n\n\n");
printf("-------------操作选项-----------\n");
printf("1:返回菜单 \n");
printf("2:退出程序 \n");
printf("3:初试化,产生随机数 \n");
printf("4:打印单链表 \n");
printf("5:插入元素 \n");
printf("6:删除j位置的元素 \n");
printf("7:查找值为k的节点位置 \n");
printf("8:对链表进行冒泡排序 \n");
printf("9:对链表进行快速排序 \n");
printf("10:对链表进行合并排序 \n");
printf("--------------------------------\n");
int x,n,i,e,k,j;
while (1)
{
printf("按数字键选择要执行的操作: ");
scanf("%d",&x);
printf("\n");
//输入2跳出循环,退出程序
if(x==2)
break;
switch(x)
{
case 1: break; //输入1,跳出switch语句,进入下一次循环
case 3: {
printf("请输入数字n(随机产生n个数):");
scanf("%d",&n);
Head=CreatListTail(n);
List = Head -> next;
break;
}
case 4:{
dispLinkList(List);
break;
}
case 5:{
printf("插入给i位置的元素为e \n");
printf("请输入i和e(中间用空格隔开)\n");
scanf("%d %d",&i,&e);
InsLinkList(List,i,e);
break;
}
case 6:{
printf("删除j位置的元素 \n");
scanf("%d",&j);
DelLinkList(List,j);
break;
}
case 7:{
printf("查找值为k的节点位置 \n");
printf("请输入k\n");
scanf("%d",&k);
//LocLinkList(List,k);
printf("%d",LocLinkList(List,k)) ;
break;
}
case 8:{
printf("对链表进行冒泡排序 \n");
start = clock();
BubbleSort(List);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "时间为 %f seconds\n", duration );
break;
}
case 9:{
printf("对链表进行快速排序 \n");
start = clock();
quickSort(List);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "时间为 %f seconds\n", duration );
break;
}
case 10:{
printf("对链表进行合并排序 \n");
start = clock();
Mergesort(&List);
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf("时间为 %f seconds\n", duration );
break;
}
default: //数字输入错误,跳出siwtch语句,进入下一次循环
printf("输入的数字不正确\n");
break;
}
}
return 0;}
项目地址:https://github.com/plusyou13/c
链表基本操作与排序(c语言)的更多相关文章
- c++学习笔记—单链表基本操作的实现
用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include ...
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
- 选择排序_C语言_数组
选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...
- shell脚本之数组基本操作及排序
数组的基本操作及排序 1.数组定义方法: ( 6 7 9 4 3 2) 0 1 2 3 4 5 #下标号 方法一: 数组名=(value0 value1 value2 -) 方法二: 数组名=([0] ...
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
- C语言链表总结(创建,排序,增加,删除)
#include <stdio.h>#include <stdlib.h> typedef struct NODE{ int data ; struct NODE * pNex ...
- 转贴:C语言链表基本操作
http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...
- 链表详解(C语言)
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用. 链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入 ...
- 数据结构 - 动态单链表的实行(C语言)
动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...
随机推荐
- PrototypePattern(原型模式)-----Java/.Net
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.
- Markdown破解及汉化
首先,附上用到的资源链接: 链接:https://pan.baidu.com/s/1ULvvCPcCv_P3KyD9ajXUjQ 提取码:5fkb 第一步 直接解压就可以,解压后运行该程序,会出现下图 ...
- python利用scapy嗅探流量
能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地 def sniff(count=0, st ...
- ACM北大暑期课培训第四天
今天讲了几个高级搜索算法:A* ,迭代加深,Alpha-Beta剪枝 以及线段树 A*算法 启发式搜索算法(A算法) : 在BFS算法中,若对每个状态n都设定估价函数 f(n)=g(n)+h(n) ...
- 解决httpclient设置代理ip之后请求无响应的问题
httpclient这个工具类对于大家来说应该都不陌生吧,最近在使用过程中出现了碰到一个棘手的问题,当请求的接口地址由http变成https之后,程序执行到 httpClient.execute(ht ...
- 【转】Java Web Services面试问题集锦
Q. 应用集成方式有哪些? A. 应用可以采用以下方式集成: 1. 共享数据库 2. 批量文件传输 3. 远程过程调用(RPC) 4. 通过消息中间件来交换异步信息(MOM) Q. 应用集成可以采用的 ...
- cesium加载WFS服务(GeoServer发布)
需求: 为了便于前端渲染数据,自定义图层渲染. 思路: 获取地图服务中的要素进行渲染. 工具: GeoServer 2.6.4,cesium, 思路有了就开始找资料写代码,cesium有接口可以加载W ...
- GitHub高级搜索指南
还在为自学时找不到适合练手的项目而苦恼? 还在好奇别人是如何在GitHub众多项目中找到高质量代码的? 真的是因为他们独具慧眼吗? 不,其实他们只是掌握了正确的搜索方法. 下面介绍几种常用的GitHu ...
- 全网最详细!Centos7.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台
背景 日常工作中,经常会用到Jmeter去压测,毕竟LR还要钱(@¥&*...),而最常用的接口压力测试,我们都是通过聚合报告去查看压测结果的,然鹅聚合报告的真的是丑到家了,作为程序猿这当然不 ...
- 玩转Django2.0---Django笔记建站基础七(表单与模型)
第七章 表单与模型 表单是搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入信息,然后提交到网站服务器端进行处理(如数据录入和用户登录.注册等). 用户表单是web开发的 ...