本设计程序用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语言)的更多相关文章

  1. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  2. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  3. 选择排序_C语言_数组

    选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...

  4. shell脚本之数组基本操作及排序

    数组的基本操作及排序 1.数组定义方法: ( 6 7 9 4 3 2) 0 1 2 3 4 5 #下标号 方法一: 数组名=(value0 value1 value2 -) 方法二: 数组名=([0] ...

  5. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  6. C语言链表总结(创建,排序,增加,删除)

    #include <stdio.h>#include <stdlib.h> typedef struct NODE{ int data ; struct NODE * pNex ...

  7. 转贴:C语言链表基本操作

    http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...

  8. 链表详解(C语言)

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用. 链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入 ...

  9. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

随机推荐

  1. C语言之while循环

    while循环能做什么??? 先来个概念格式,while循环的一般形式为: while(表达式){ 语句块 } 意思是,先计算"表达式"的值,当值为真(非0)时, 执行" ...

  2. day3(if和for)

    if if <条件判断 1>: <执行 1>elif <条件判断 2>: <执行 2>elif <条件判断 3>: <执行 3> ...

  3. Ant Design中getFieldDecorator方法的特殊用法(小bug)

    记录Ant Design中getFieldDecorator方法的特殊的一个用法 了解Ant Design表单的小伙伴都知道,getFieldDecorator在大部分情况下是用来绑定一个控件的,即像 ...

  4. 爆破linux密码 $6$3uwqC9JI$d9iPRmTDAoXs/IbsplxS3iyeErHqw7fUycacXNHyZk1UCSwFEydl515/zXN7OEwHnyUaqYcNG

    #!/usr/bin/env python # -*- coding:UTF-8 -*- import crypt import sys # 哈希密码的前两位就是盐的前两位,这里我们假设盐只有两位. ...

  5. SpringBoot基于数据库的定时任务统一管理

    定时任务1 import lombok.extern.slf4j.Slf4j; /** * @author Created by niugang on 2019/12/24/15:29 */ @Slf ...

  6. Java项目之客户信息管理软件

    模拟实现基于文本界面的客户信息管理软件,该软件能够实现对客户对象的插入. 修改和删除(用数组实现),并能够打印客户明细表. 项目采用分级菜单方式.主菜单如下: “添加客户”的界面及操作过程如下所示: ...

  7. 《深入理解 Java 虚拟机》读书笔记:虚拟机性能监控与故障处理工具

    正文 一.JDK 的命令行工具 JDK 的 bin 目录下提供了一些用于监视虚拟机和故障处理的命令行工具. 名称 主要作用 jps JVM Process Status Tool,显示正在运行的虚拟机 ...

  8. Java小白集合源码的学习系列:Vector

    目录 Vector源码学习 Vector继承体系 Vector核心源码 基本属性 构造器 扩容机制 Enumeration 概述 源码描述 具体操作 Vector总结 Vector源码学习 前文传送门 ...

  9. Android Studio 图形化设计 UI 界面

    我们开发 Android 程序必定是从 UI 开始的 ,使用最新版的 Android Studio 可以在图形化界面下设计软件 UI, Android Studio 默认的布局是 Constraint ...

  10. [状压DP思路妙题]图

    源自 luhong 大爷的 FJ 省冬令营模拟赛题 Statement 给定一个 \(n\) 个点 \(m\) 条边的图,没有重边与自环 每条边的两端点编号之差不超过 \(12\) 求选出一个非空点集 ...