C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "SequenceList.h" int main()
{
//创建顺序表和指针
SequenceList SL, * P_SL;
int choice = 0;
P_SL = &SL;
SL.length = 0; //初始化顺序表长度
menu();
while (true)
{
printf("\n请输入您的选择:");
fflush(stdin);
scanf_s("%d", &choice);
switch (choice)
{
case 0:
exitSystem();
break;
case 1:
inputPL(P_SL);
break;
case 2:
ouputPL(P_SL);
break;
case 3:
insertSLHead(P_SL);
break;
case 4:
insertSLTail(P_SL);
break;
case 5:
insertSLIndex(P_SL);
break;
case 6:
deleteSLHead(P_SL);
break;
case 7:
deleteSLTail(P_SL);
break;
case 8:
deleteSLIndex(P_SL);
break;
case 9:
bubbleSortSLData(P_SL);
break;
case 10:
findSLData(P_SL);
break;
default:
system("cls");
break;
}
} system("pause");
return 0;
}
SequenceList.h:
#ifndef _SEQUENCE_H_
#define _SEQUENCE_H_ #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXSIZE 20 //定义顺序表
typedef struct
{
int data[MAXSIZE]; //顺序表中用来保存数据的数组
int length; //顺序表的长度
}SequenceList; //退出系统
void exitSystem(); //用来设计虚拟界面的边框
void printStar(); //界面
void menu(); //顺序表的初始化 以及输入
void inputPL(SequenceList* P_SL); //输出顺序表
void ouputPL(SequenceList* P_SL); //从头部插入数据
void insertSLHead(SequenceList* P_SL); //从尾部插入数据
void insertSLTail(SequenceList* P_SL); //指定位置插入数据
void insertSLIndex(SequenceList* P_SL); //删除头部结点
void deleteSLHead(SequenceList* P_SL); //删除尾部结点
void deleteSLTail(SequenceList* P_SL); //指定位置删除结点
void deleteSLIndex(SequenceList* P_SL); //查找顺序表中的元素
void findSLData(SequenceList* P_SL); //冒泡排序
void bubbleSortSLData(SequenceList* P_SL); #endif
SequenceList.c:
#include "SequenceList.h" //用来设计虚拟界面的边框
void printStar()
{
for (int i = 0; i < 70; i++)
{
printf("*");
}
printf("\n");
}
//界面
void menu()
{
printStar();
printf("\t\t\t欢迎进入顺序表操作界面!\n");
printf("请从键盘输入数字,完成对应的操作(1到8为有效操作,输入其他退出程序)\n");
printf("\t 0.退出系统\n");
printf("\t 1.从键盘连续输入n个整数,建立一个顺序表\n");
printf("\t 2.输出该顺序表\n");
printf("\t 3.从键盘输入一个整数,插入到顺序表的头部\n");
printf("\t 4.从键盘输入一个整数,插入到顺序表的尾部\n");
printf("\t 5.从键盘输入一个整数,插入到顺序表的指定位置\n");
printf("\t 6.从顺序表的头部删除一个结点\n");
printf("\t 7.从顺序表的尾部删除一个结点\n");
printf("\t 8.从顺序表的指定位置删除一个结点\n");
printf("\t 9.对顺序表进行排序(冒泡排序)\n");
printf("\t 10.从顺序表中查找元素(二分查找)查找之前要先排序\n");
printStar();
} //退出系统
void exitSystem()
{
printf("欢迎下次使用!\n");
system("pause");
exit(0);
} //初始化顺序表
void inputPL(SequenceList* P_SL)
{
int length;
printf("请输入顺序表的长度:");
scanf_s("%d", &length);
printf("请输入 %d 个数据:", length);
for (int i = 0; i < length; i++)
{
scanf_s("%d", &P_SL->data[i]);
}
P_SL->length = length; //更新一下顺序表的长度 } //输出顺序表
void ouputPL(SequenceList* P_SL)
{ if (P_SL->length == 0)
{
printf("该顺序表为空,请先选择输入!\n"); }
else
{
printf("输出的顺序表:\n");
for (int i = 0; i < P_SL->length; i++)
{
printf("array[%d] = %d \n", i, P_SL->data[i]);
}
printf("\n");
}
} //从头部插入数据
void insertSLHead(SequenceList* P_SL)
{
int data = 0;
printf("请输入一个整数,从头部插入数据:\n");
scanf_s("%d", &data);
if (P_SL->length == 0)
{
//顺序表为空
P_SL->length++;
P_SL->data[0] = data;
}
else
{
P_SL->length++;
for (int i = P_SL->length - 1; i > 0; i--)
{
P_SL->data[i] = P_SL->data[i - 1];
}
P_SL->data[0] = data;
}
printf("从头部插入数据已成功!\n");
} //从尾部插入数据
void insertSLTail(SequenceList* P_SL)
{
int data = 0;
printf("请输入一个整数,从尾部插入到顺序表中:\n");
scanf_s("%d", &data);
P_SL->length++;
P_SL->data[P_SL->length-1] = data; printf("从尾部插入数据成功!\n");
} //指定位置插入数据
void insertSLIndex(SequenceList* P_SL)
{
int data = 0, index = 0;
printf("请输入插入顺序表中的位置(下标值):\n");
scanf_s("%d", &index);
if (index == 0)
{
insertSLHead(P_SL);
}
else if (index == P_SL->length)
{
insertSLTail(P_SL);
}
else if (index < 0 || index > P_SL->length)
{
printf("您输入插入的位置不对,重新输入!\n");
insertSLIndex(P_SL);
}
else
{
P_SL->length++;
printf("请输入您要插入的结点值:\n");
scanf_s("%d", &data);
for (int i = P_SL->length - 2; i > 0; i--)
{
if (i == index)
{
for (int j = P_SL->length; j >= i; j--)
{
P_SL->data[j] = P_SL->data[j - 1];
}
P_SL->data[index] = data;
break;
}
}
}
} //删除头部结点
void deleteSLHead(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
for (int i = 1; i < P_SL->length; i++)
{
P_SL->data[i - 1] = P_SL->data[i];
}
printf("头部删除结点成功!\n");
P_SL->data[P_SL->length] = 0;
P_SL->length--; }
} //删除尾部结点
void deleteSLTail(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
P_SL->data[P_SL->length - 1] = 0;
P_SL->length--;
printf("尾部删除结点成功!\n");
}
} //指定位置删除结点
void deleteSLIndex(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法删除!\n");
}
else
{
int data = 0, index = 0;
printf("请输入删除结点的位置:");
scanf_s("%d", &index);
if (index == 0)
{
deleteSLHead(P_SL);
}
else if (index == P_SL->length - 1)
{
deleteSLTail(P_SL);
}
else if (index < 0 || index >= P_SL->length)
{
printf("您输入删除的位置不对,重新输入!\n");
deleteSLIndex(P_SL);
}
else
{
for (int i = 1; i < P_SL->length - 1; i++)
{
if (index == i)
{
for (int j = i; j < P_SL->length - 1; j++)
{
P_SL->data[j] = P_SL->data[j + 1];
}
P_SL->data[P_SL->length - 1] = 0;
P_SL->length--;
printf("指定位置删除成功!\n");
break;
}
}
}
}
} //冒泡排序
void bubbleSortSLData(SequenceList* P_SL)
{
for (int i = 0; i < P_SL->length; i++) //确定排序趟数
{
for (int j = i + 1; j < P_SL->length; j++) //确定比较次数
{
if (P_SL->data[i] > P_SL->data[j])
{
int temp = P_SL->data[i];
P_SL->data[i] = P_SL->data[j];
P_SL->data[j] = temp;
}
}
}
printf("排序成功!\n");
} //查找顺序表中的元素
void findSLData(SequenceList* P_SL)
{
if (P_SL->length == 0)
{
printf("该顺序表为空,无法查找!\n");
}
else
{
/*二分查找法*/
int data = 0;
int top = 0, end = P_SL->length - 1, mid; //定义头部,中部,尾部三个下标
int find = -1; //定义需要找的数的下标 -1说明没找到
//printf("end = %d\n", end);
printf("请输入查找的数据:");
scanf_s("%d", &data);
while (top <= end)
{
mid = (top + end) / 2;
if (P_SL->data[mid] == data)
{
find = mid;
break; //如果找到直接退出循环
}
else if (P_SL->data[mid] > data)
{
//如果当前的值比查找的值大,就将尾部的下标移至mid的前一处
end = mid - 1;
}
else
{
//如果当前的值比需要找的值小,就将头部的下标移到mid的后一处
top = mid + 1;
}
}
if (find == -1)
{
printf("查找失败,此顺序表中没有该数据!\n");
}
else
{
printf("查找成功,%d在数组array里面 \n", data);
}
}
}
C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法的更多相关文章
- 数据结构C语言版--动态顺序表的基本功能实现(二)
/* * 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"." * 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用 ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- [Python] 数据结构--实现顺序表、链表、栈和队列
说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...
- lintcode-106-排序列表转换为二分查找树
106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...
- 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现
逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...
- 深入浅出数据结构C语言版(12)——从二分查找到二叉树
在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
- [数据结构]C#顺序表的实现
在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...
- C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
- 数据结构之顺序表,c#实现
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
随机推荐
- JavaScript 基础学习(一)
JavaScript基础学习(一) 一.JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件 ...
- 03 Proxmox VE介绍
突破困境! 企业开源虚拟化管理平台 使用Proxmox Virtual Environment 郑郁霖(Jason Cheng)著 版次:2021年12月初版 03 Proxmox VE介绍 3.1 ...
- 【快速学】C/C++编译器
编译器 谁维护 平台 版权 Visual C++ Microsoft https://visualstudio.microsoft.com/ Microsoft Windows 有免费版 GCC C ...
- Java-面向对象进阶 继承限制
1.子类可以继承父类的那些资源 private成员 子类和父类不在同一个包,使用默认访问权限的成员 构造方法
- Hub
public class StreamHub : Hub { public ChannelReader<string> ReadLogStream() { var channel = Ch ...
- c# 如何实现图片压缩
一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的.尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图. 下面贴出我自己琢磨 ...
- Kubernetes基础配置管理
一.ConfigMap创建 1-1.基于目录创建ConfigMap 首先创建一个configmap/conf存储目录,分别建立.conf文件 mkdir /configmap/conf #创建.con ...
- node.js请求css、js静态资源页面不生效
产生原因:文件响应头内容类型错误 解决方案:设置对应的响应头内容类型 const http = require('http'); const fs = require('fs'); const pat ...
- Flink配置详解及实践
#jobManager的IP地址jobmanager.rpc.address: localhost #JobManager的端口号jobmanager.rpc.port: 6123 # JobMana ...
- 5G工业网关在智能工厂的应用案例
智能工厂是5G技术的重要应用场景之一.利用5G网络将生产设备无缝连接,并进一步打通设计.采购.仓储.物流等环节,使生产更加扁平化.定制化.智能化,从而构造一个面向未来的智能制造网络. 5G 作为最优的 ...