顺序表的基本操作
程序员文章站
2024-03-20 14:25:04
...
#include<iostream>
using namespace std;
//#define MaxSize 10; 使用define的时候后面没有 ;
//#define ElemType ElemType ;
//数据类型修改别名的时候用typedef 并且是定义数组类型成新的别名 ElemType ->newType
#define MaxSize 10
#define overflow -1
#define OK 1
#define error -2
typedef int ElemType;
/*typedef struct
{
ElemType data[MaxSize];//存放顺序表元素的数组
ElemType length; //定义当前位置
}Sqlist;书上用数组来存储没写完全 先用的网上别人的方法 */
typedef struct
{
ElemType *elem; //存储空间的首地址
ElemType sqlistMaxSize;//线性表的最大长度
ElemType length;//当前长度
}Sqlist;
ElemType initSqlst(Sqlist &L); //构造一个空的顺序表
void printTypeSqlist(Sqlist L); //将整个顺序表打印出来
ElemType insertSqlist(Sqlist &L, ElemType n,ElemType num ); //在第n个位置 插入数num
ElemType deleteSqlist(Sqlist &L, ElemType n); //删除的时候只需要把后面一个覆盖到前面的一个即可
ElemType FindValuePosition(Sqlist &L , ElemType value); //查询value所在的位置
//已知一个顺序表L,其中元素有序排列,插入一个数字,使得L仍然是有序排列。
ElemType FindAndInsert(Sqlist& L,ElemType value);
ElemType initSqlst(Sqlist &L) //构造一个空的顺序表
{
L.elem = new ElemType[MaxSize];
//首先定义一个数组ElemType[MaxSize],然后新生成一个指针指向这个区域
//new的时候也可能失败(系统的内存空间不足),一般的判空处理就足够了
if(!L.elem)
exit(overflow); //缓冲区溢出
L.sqlistMaxSize = MaxSize; //初始化最大长度
L.length = 0;
return OK;
//初始化当前位置
}
void printTypeSqlist(Sqlist L)
{
for(ElemType i = 0; i <= L.length - 1 ;i++)
cout<<L.elem[i]<<" ";
}
ElemType insertSqlist(Sqlist &L, ElemType n,ElemType num ) //在第n个位置 插入数num
{
if(n < 1|| n > L.sqlistMaxSize || L.length == L.sqlistMaxSize)
//必须是可以修改的左值 -> "=" 和 "=="的问题
exit(error);
for(ElemType j = L.length ;j > n; j -- )
{
L.elem[j+1] = L.elem[j]; //下标要求数组或指针类型
}
L.elem[n-1] = num;
L.length++;
return OK;
}
ElemType deleteSqlist(Sqlist &L, ElemType n) //删除的时候只需要把后面一个覆盖到前面的一个即可
{
if(n < 1||n > L.sqlistMaxSize)
exit(error);
for(ElemType i = n -1 ; i < L.length - 1;i++)
//i = n - 1 ;将数组和第几个数对应起来 数组从0开始
{
//L.elem[i] = L.elem[i++];自加运算符不对 他的运算之后才变成下一个
L.elem[i] = L.elem[i+1];
}
L.length--;
return OK;
}
ElemType FindValuePosition(Sqlist &L , ElemType value)
{
if(L.length == 0)
//cout<<"该链表为空!";
exit(error);
for(ElemType i = 0;i <= L.length -1 ;i++)
{
if(L.elem[i] == value)
return i ;
}
exit(error);
}
ElemType FindAndInsert(Sqlist& L,ElemType value)
{
if(L.length == L.sqlistMaxSize)
return error;
//1.find the position
ElemType markPosition;
for(ElemType i = 0; i < L.length - 1; i++)
if(L.elem[i] > value)
{
markPosition = i;
break;
}
//2 insert ElemType into the position
for(ElemType j = L.length - 1 ;j >= markPosition;j--)
L.elem[j+1] = L.elem[j];
L.elem[markPosition] = value;
L.length++;
return OK;
}
void main()
{
Sqlist L;
//明白定义和初始化的区别 这一步:
//L{elem=0x00000000 sqlistMaxSize=10375476 length=4586612 } Sqlist
ElemType status1 = initSqlst(L);
//L {elem=0x00143a98 sqlistMaxSize=10 length=0 } Sqlist
//为什么这两者不一样呢?
//cout<<"顺序表L首地址L.elem[0]:"<<&(L.elem[0])<<endl;
//cout<<"顺序表L地址L.elem:"<<&(L.elem)<<endl;
ElemType status2 = insertSqlist(L, 1,1 );
for (ElemType n = 2;n <10; n ++)
{
status2 = insertSqlist(L, n,n);
}
status2 = insertSqlist(L, 10,10 );
cout<<"L顺序表的长度:"<<L.length<<endl;
printTypeSqlist(L);
ElemType status3 = deleteSqlist( L, 5);
cout<<endl;
cout<<"删除之后的链表为:";
printTypeSqlist(L);
ElemType status4 = FindValuePosition(L , 4);
cout<<endl;
cout<<"在顺序表中的位置为:"<<status4<<endl;
status4 = FindAndInsert(L,4);
cout<<"插入之后的链表为:";
printTypeSqlist(L);
}
遇到的问题:
1.//#define MaxSize 10; 使用define的时候后面没有 ;
2.//#define ElemType int ; 数据类型修改别名的时候用typedef 并且是定义数组类型成新的别名 int ->newType
3.//必须是可以修改的左值 -> "=" 和 "=="的问题
总是把 == 写成 =导致很多莫名其妙的小错误...
4.下标要求数组或指针类型 //使用下标的时候必须是数组或者指针!
5.定义和初始化的问题!
定义了代表系统给分配了内存和一些值
但是要自己去初始化,否则会产生一些问题...(还不知道啥问题)
6.//cout<<"顺序表L首地址L.elem[0]:"<<&(L.elem[0])<<endl;
//cout<<"顺序表L地址L.elem:"<<&(L.elem)<<endl;
两者输出的地址不同,不都应该是顺序表的首地址吗?搞不懂额。。
7.在顺序表的位置是从0开始 -》 0 1 2 3 ...
但是实际元素的表示都是用第几位 ... 要进行转换下 否则出问题
从顺序表考虑 : 减一 并且 使用小于等于 大于等于
从第几个数考虑 :不减一 并且直接使用大于小于
8.定义和初始化的问题。数组和指针。