线性表
一 准备工作
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 // list的初始大小
#define LISTINCREMENT 10 //每次扩容增加的内存大小
#define ElemType int
#define Status int
#define OK 1
#define ERROR 0
typedef struct
{
ElemType * elem; // elem
int length;
int listsize;
}SqList; // 定义一个名为Sqlist的结构体,这就时我们的表
二 对于线性表的基本操作
1 初始化
Status InitList_Sq(SqList &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);//如果无法分配内存,退出
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
2 摧毁列表
void DestoryList(SqList &L)
{
free(&L);
}
3 清空列表
清空列表不意味着释放内存,在C++的vector数据类型的clear()也是这样
void ClearList(SqList &L)
{
L.length=0;
//make the length of L zero
}
4 判断表是否为空
若空,返回true,非空,返回false
bool List_Empty(SqList L)
{
if(L.length) return false;
return true;
}
5 获取表的长度
int List_Length(SqList L)
{
return L.length;
}
6 用e返回第i个元素的值
int GetElem(SqList L,int i,int &e)
{
if(i>=1&&i<=L.length)
{
e=L.elem[i-1];
return true;
}
return false;
}
7 定位元素位置
我们可以自定义Compare()函数得到第一个满足条件的函数的位置
int LocateElem(SqList L,int e,bool Compare(int x,int y))
{
for (int i=1; i<=L.length; i++)
{
if(Compare(e,L.elem[i-1]))
return i;
}
return 0;
}
8 获取下一个元素的位置
int PriorElem(SqList L,int cur_e,int &pre_e)
{
for (int i=1; i<=L.length; i++)
{
if(L.elem[i-1]==cur_e)
{
if(i==1) return 0;
pre_e=L.elem[i-2];
return 1;
}
}
return 0;
}
9 插入元素
int List_Insert_Sq(SqList &L,int i,int e)
{
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize)
{
int* newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT) * sizeof(ElemType));//重新分配内存
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;//增加表的容量
}
//开始进行表内元素的移动
int *q = &(L.elem[i-1]);
for (int *p=&(L.elem[L.length-1]); p>=q; p--)
{
*(p+1)=*p;
}
*q=e;
L.length++;
return OK;
}
10 向列表尾部加入元素
int List_push_back(SqList &L,int e)
{
// 如果内存不足,重新分配
if(L.length==L.listsize)
{
int *newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT) * sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
L.elem[L.length]=e;
L.length++;
return OK;
}
11 弹出最后的元素
并用e返回这个元素
int List_pop(SqList &L,int e)
{
if(!L.length) return ERROR;
e=L.elem[L.length-1];
L.length--;
return OK;
}
12 删除元素
int List_Delete_Sq(SqList &L,int i,int &e)
{
if(i<1||i>L.length) return ERROR;
int *p=&L.elem[i-1];
e=L.elem[i-1];
for (int *q=&L.elem[L.length-1]; p<q; p++)
{
*p=*(p+1);
}
//删除之后后面的元素对前面进行补位
L.elem[L.length-1]=0;
L.length--;
return OK;
}
13 对表内元素进行排序
在这里我们使用快排
排序算法出门右转
void List_sort(SqList &L,int start,int end ,bool Compare(int x,int y))
{
int mid=L.elem[(start+end)/2];
int i=start;
int j=end;
while (i<=j)
{
while(Compare(L.elem[i],mid)) i++;
while(Compare(mid,L.elem[j])) j--;
if(i<=j)
{
int temp=L.elem[i];
L.elem[i]=L.elem[j];
L.elem[j]=temp;
i++;
j--;
}
if(i<end) List_sort(L, i, end, Compare);
if(j>start) List_sort(L, start, j, Compare);
}
}
三 验证我们的表
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
SqList List;
InitList_Sq(List);
for(int i=1;i<=10;i++)
List_push_back(List, i);
printf("%d\n",*(List.elem));
List_Insert_Sq(List, 2, 6);
printf("%d\n",*(List.elem+1));//search for the second elem
int second;
List_Delete_Sq(List, 2, second);
printf("%d\n",*(List.elem+1));
List_sort(List, 0, List.length-1, cmp);
printf("%d\n",List.elem[1]);
}
结果如下