(复习考研的休息区,心血来潮,写点代码)
三个规则:
1、不使用c++ stl库进行书写
2、最好基于严蔚敏老师的数据结构
3、最好使用malloc和realloc动态分配内存
(如果有问题,请大家看看)
cpp
// 线性表的顺序存储
// 不使用stl
#include<iostream>
#include<cstring>
using namespace std;
#define LIST_INIT_SIZE 100 // 线性表的初始空间
#define LISTINCREMENT 10 // 分配增量
#define OK true
#define ERROR false
#define ERRORINT 0x3f3f3f3f3f
typedef struct
{
int *elem; // 顺序表的基址
int len; // 当前长度
int listsize; // 当前分配的存储容量
}SqList;
bool InitList_Sq(SqList &L)
{
// L.elem = new int[LIST_INIT_SIZE];
L.elem = (int *)malloc(sizeof(int) * LIST_INIT_SIZE);
if(!L.elem) exit(0); // 分配失败
L.len = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
bool ClearList(SqList &L)
{
if(!L.elem) return ERROR;
printf("已被清空\n");
if(L.len == 0) return OK;
for(int i = 0;i < L.len;i ++)
L.elem[i] = 0; // 清零
L.len = 0;
return OK;
}
bool ListEmpty(SqList L)
{
if(!L.elem) exit(0);
if(L.len == 0) return OK;
return ERROR;
}
int ListLength(SqList L)
{
if(!L.elem) exit(0);
return L.len;
}
// 注意:线性表编号一定是从1~n
int GetElem(SqList L , int idx)
{
if(idx < 1 || idx > L.len) return ERRORINT;
return L.elem[idx - 1];
}
/*
'>'找到第一个大于e的值的位序
'<'找到第一个小于e的值的位序
'='找到第一个等于e的值的位序
*/
int LocateElem(SqList L , int e , char ch)
{
if(!L.elem) exit(0);
if(ch == '=')
{
for(int i = 0;i < L.len;i ++)
if(L.elem[i] == e) return i + 1;
}
else if(ch == '>')
{
for(int i = 0;i < L.len;i ++)
if(L.elem[i] > e) return i + 1;
}
else if(ch == '<')
{
for(int i = 0;i < L.len;i ++)
if(L.elem[i] < e) return i + 1;
}
return 0; // 没有找到
}
bool ListInsert(SqList &L , int idx , int e)
{
if(idx < 1 || idx > L.len + 1) return ERROR;
if(L.len >= L.listsize) // 增加分配
{
cout << "该表重新分配内存\n";
L.elem = (int *)realloc(L.elem , sizeof(int) * (L.listsize + LISTINCREMENT));
L.listsize += LISTINCREMENT;
}
for(int i = L.len - 1;i >= idx - 1;i --)
L.elem[i + 1] = L.elem[i];
printf("插入数据%d\n" , e);
L.elem[idx - 1] = e;
L.len ++;
return OK;
}
int ListDelete(SqList &L , int idx)
{
if(idx < 1 || idx > L.len) return ERRORINT;
int e = L.elem[idx - 1];
printf("删除数据%d\n" , e);
for(int i = idx - 1;i < L.len;i ++)
L.elem[i] = L.elem[i + 1];
L.len --;
return e;
}
void ListPrint(SqList L)
{
if(!L.elem) exit(0);
cout << "当前顺序表是:";
for(int i = 0;i < L.len;i ++)
cout << L.elem[i] << " ";
cout << "\n";
return ;
}
int main()
{
SqList L;
InitList_Sq(L);
for(int i = 10;i >= 1;i --) // 正向插入数据1~10
ListInsert(L , 1 , i);
ListPrint(L);
ListDelete(L , 1);
ListDelete(L , 3);
ListPrint(L);
}