(复习考研的休息区,心血来潮,写点代码)
三个规则:
1、不使用c++ stl库进行书写
2、最好基于严蔚敏老师的数据结构
3、最好使用malloc和realloc动态分配内存
(如果有问题,请大家看看)
// 线性表的顺序存储
// 不使用stl
#include<iostream>
#include<cstring>using namespace std;#define LIST_INIT_SIZE 100 // 线性表的初始空间
#define LISTINCREMENT 10 // 分配增量
#define OK true
#define ERROR false
#define ERRORINT 0x3f3f3f3f3ftypedef 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);
}