前段时间处理转专业后的各种事情,已经基本处理好了,同时
对 一直很怕的指针进行了系统性学习,学完发现也就那样
解决了我长久以来的疑惑(如->符号等)
对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;
}
|