IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 顺序表的基本操作(详细代码/可视化操作) 《数据结构》C语言版 -> 正文阅读

[数据结构与算法]顺序表的基本操作(详细代码/可视化操作) 《数据结构》C语言版

前段时间处理转专业后的各种事情,已经基本处理好了,同时

对 一直很怕的指针进行了系统性学习,学完发现也就那样

解决了我长久以来的疑惑(如->符号等)

对memset、sizeof,还有一些头文件进行了深入研究

已经完成了良好的基础奠定

国庆节前完成了情报收集工作,全面开展对《数据结构》的学习

在三天内我会陆续更新我的代码

会快速推进到队列的章节

覆盖各个衍生版本(比如:顺序表 衍生链表、双向链表、头尾链表等)

我不喜欢包括Elemtype这类的表达,认为是多此一举

不就是把int换成了“元素类型”的英文表达

这会让代码很不直观

为了和书本保持一致,我替换为type1、2

下面代码很大部分是参考:lady_killer9

这是一位很棒的博主!

我首先优化了视觉模块,之后根据书上的代码

进行函数补充、额外新增一个易位函数、修复bug

另外,我标注了是C++

为什么下面代码没有变成 黑底蓝绿的C++显示模式?

强迫症表示难受

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MaxSize 100
#define type1 int
#define type2 int
using namespace std;
typedef struct{							 
	type1 data[MaxSize];					//空间 
	int length;								//总长度 
}SXB;										//《自定义结构·顺序表》 
 
 
//《操作函数·模块》 ---------------------------------------------------------------------
//《初始化》 
int InitList(SXB &L){				
	memset(L.data, 0, sizeof(L));			//将 结构L中data数组,全部初始化为0 
	L.length = 0;                			//初始化长度为0
	return 0;
}
//《创建新表》 
bool CreateList(SXB &L, int n){			
	if (n<0 || n>MaxSize)false;				//总长度异常·报告创建失败
	L.length=n; 							//长度存储 
	for (int i = 0; i<n; i++)				//内容输入 
		scanf("%d", &L.data[i]);
	return true;							//报告创建成功 
}
//《插入·第I个位置》 
bool InsertList(SXB &L, int i, type1 e){	 
	if (i<1 || i>L.length + 1){					
		printf("位置无效!!!\n");
		return false;
	}	
	if (L.length >= MaxSize){
		printf("当前存储空间已满!!!\n");
		return false;
	}//失败!  位置非法·内存溢出 
	for (int j = L.length; j >= i; j--)				//正常情况·有效输入 
		L.data[j] = L.data[j - 1];					//从后向前·到 I 全部后移一位 
	L.data[i - 1] = e;								//第I输入为元素e 
	L.length++;										//长度++ 
	return true;//成功!! 
}
//《删除·第I个元素》 
bool  ListDelete(SXB &L, int i){			
	if (i<1 || i>L.length){
		printf("位置无效!!!\n");
		return false;
	}											//异常情况·跳出)
	for (int j = i; j <= L.length - 1; j++)			//从I往后,全部前移 
		L.data[j - 1] = L.data[j];
	L.length--;										//长度-- 
	return true;
}
//《追踪·元素位置》
int LocateElem(SXB L, type1 e){
	if(L.length==0)	return 0;
	for (int i = 0; i<L.length; i++)
		if (L.data[i] == e)
			return i + 1;							//内存中存的实际位置 比 现实中 -1 
	return 0;//没找到 
}
//《倒置》
void Reverse(SXB &L){							 	
	for (int i = 0; i<L.length - 1 - i; i++){
		int t = L.data[i];
		L.data[i] = L.data[L.length - 1 - i];
		L.data[L.length - 1 - i] = t;
	}
}
//《清空·长度=0》
void ClearList(SXB &L) {				 
	L.length=0;
}
//《摧毁·全部重置》·这TM不就是初始化吗?翻译翻译什么叫摧毁 
void DestoryList(SXB &L) {				 
	memset(L.data,0,sizeof(L.data));
	L.length=0;
}
//《判断·是否空表》
bool ListEmpty(SXB &L){
	if(L.length==0) return true;
	else return false;
}
//《返回·表长度》 
int ListLength(SXB &L){
	return L.length;
} 
//《返回·第I个元素》 
bool GetElem(SXB &L,int t,int &e){
	if(t<1||t>L.length)	return false;
	else e=L.data[t-1];
	return true;
}
//《返回·元素的前驱》
bool PriorElem(SXB &L,int e,int &pre_e){
	int l=LocateElem(L,e);
	if(l==0)	return false;
	pre_e=L.data[l-2];		//l-1是本体位置,-1才是前驱,+0才是后继 
	return true; 
	//要求,不是第一个元素 且 各元素数值不同 
} 
//《返回·元素的后继》
bool NextElem(SXB &L,int e,int &pre_e){
	int l=LocateElem(L,e);
	if(l==0)	return false;
	pre_e=L.data[l];
	return true; 
} 
//《换位置》 
bool Change(SXB &L,int a,int b){
	if(a==b||	(a<1||a>L.length)	||	(b<1||b>L.length)	)
		return false;	//不重合,不溢出 
	int c;c=L.data[a-1];L.data[a-1]=L.data[b-1];L.data[b-1]=c;
	return true;
}
 
 
 
 
 
 
//《可视化操作·模块》 ---------------------------------------------------------
void PrintList(SXB L){					
	printf("\n当前顺序表所有元素:");
	for (int i = 0; i<L.length; i++)
		printf("%d ", L.data[i]);
	printf("\n\n");
}
void Create(SXB &L){				
	int n; bool flag;
	L.length = 0;
	printf("请输入要创建的顺序表长度(>1):");
	scanf("%d", &n);
	printf("请输入%d个数(空格隔开):", n);
	flag = CreateList(L, n);
	if (flag) {
		printf("创建成功!\n");
		PrintList(L);
	}
	else printf("输入长度非法!\n");
}
void Insert(SXB &L){
	int place; type1 e; bool flag;
	printf("请输入要插入的位置(从1开始)及元素:");
	scanf("%d%d", &place, &e);
	flag = InsertList(L, place, e);
	if (flag){
		printf("插入成功!!!\n");
		PrintList(L);
	}
}
void Delete(SXB &L){
	int place; bool flag;
	printf("请输入要删除的位置(从1开始):\n");
	scanf("%d", &place);
	flag = ListDelete(L, place);
	if (flag){
		printf("删除成功!!!\n");
		PrintList(L);
	}
}
void Search(SXB L){
	type1 e; int flag;
	printf("请输入要查找的值:\n");
	scanf("%d", &e);
	flag = LocateElem(L, e);
	if (flag)
		printf("该元素位置为:%d\n", flag);
	else
		printf("未找到该元素!\n");
}
void PriorElem2(SXB &L){
	int e,pre_e;
	printf("输入被追踪元素:");scanf("%d",&e);
	PriorElem(L,e,pre_e); 
	printf("该元素前驱是:%d\n",pre_e);
}
void NextElem2(SXB &L){
	int e,pre_e;
	printf("输入被追踪元素:");scanf("%d",&e);
	NextElem(L,e,pre_e); 
	printf("该元素后继是:%d\n",pre_e);
}
void ListLength2(SXB &L){
	printf("表长度为:%d\n",ListLength(L));
} 
void ListEmpty2(SXB &L){
	if(ListEmpty(L))	printf("woc这居然是个空表\n");
	else	printf("人家已经有男朋友了,你放弃吧\n");
}
void GetElem2(SXB &L) {
	int e,t;
	printf("您要查看第几个元素:");scanf("%d",&t);
	if(GetElem(L,t,e))	printf("第%d个元素是%d\n",t,e);
	else	printf("您输入的地址无效!\n");
}
void Change2(SXB &L) {
	int a,b;
	printf("输入你想调换的两个元素地址:");
	scanf("%d %d",&a,&b);
	if(Change(L,a,b))	printf("成功!");
	else	printf("失败!");
}
void menu(){
	system("cls"); 
	printf("********1.创建                        2.插入*********\n");
	printf("********3.删除                        4.查找*********\n");
	printf("********5.倒置                        6.摧毁*********\n");
	printf("********7.初始化                      8.清空*********\n");
	printf("********9.前驱返回               10.后继返回*********\n");
	printf("*******11.表长度返回             12.空表判断*********\n");
	printf("*******13.第I个元素返回          14.元素调顺序*********\n");
}
 
 
//《主程序·模块》 -------------------------------------------------------------
int main(){
	SXB L;InitList(L);
	int choice;
	while(1){
		menu();
		PrintList(L);
		printf("请输入菜单序号:");
		scanf("%d", &choice);
		switch (choice){
			case 1:Create(L); system("pause");break;
			case 2:Insert(L); system("pause");break;
			case 3:Delete(L); system("pause");break;
			case 4:Search(L); system("pause");break;
			case 5:Reverse(L); system("pause");break;
			case 6:DestoryList(L);	 system("pause");break;
			case 7:InitList(L);		 system("pause");break;
			case 8:ClearList(L); 	system("pause");break;
			case 9:PriorElem2(L); 	system("pause");break;
			case 10:NextElem2(L); 	system("pause");break;
			case 11:ListLength2(L); system("pause");break;
			case 12:ListEmpty2(L); 	system("pause");break;
			case 13:GetElem2(L); 	system("pause");break;
			case 14:Change2(L);  	system("pause");break;
		default:printf("SXH大彩笔!\n");system("pause");
		}
	}
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 17:08:43  更:2021-10-01 17:10:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:45:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码