线性表是由n个数据元素的有序序列
下面是关于线性表的基本操作
(由于是使用VS编译,scanf 表示为scanf_s)
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 20
#define LISTCREMENT 10
#define Error 0
#define OK 1
//线性表的动态分配顺序储存结构
typedef int Elemtype;
typedef int status;
typedef struct{
int Length;
Elemtype *elem;
int listsize;
}SqList;
status InitList(SqList& L) {
L.elem = (Elemtype*)malloc(LISTSIZE * sizeof(Elemtype));
if (!L.elem) //存储分配失败
return Error;
L.Length = 0; //定义空表初始长度
L.listsize = LISTSIZE;//初始储存容量
return OK;
}
//向线性表中输入数据
status CreatList(SqList& L,int n) {
Elemtype* p;
for (p = L.elem; p < L.elem +n; p++) {
L.Length++;
scanf_s("%d", p);
}
return OK;
}
//将线性表中第i个元素赋值给e;
status GerElem(SqList L, int i, Elemtype* e) {
if (i<1 || i>L.Length || L.Length == 0)//当i不符合数组长度或者数组长度为0,寻找错误
return Error;
else
*e=L.elem[i - 1];
printf("%d", *e);
return OK;
}
//插入一个新元素
status ListInsert(SqList &L, int i, Elemtype e) {
Elemtype *newbase;//定义新基地址
Elemtype *p;
if (i<1 || i>L.Length + 1)
return Error;
if (L.Length >= L.listsize) {
newbase = (Elemtype*)realloc(L.elem, (L.listsize + LISTCREMENT) * sizeof(Elemtype));//增加分配
if (!newbase)
return Error;//分配错误
L.elem = newbase;//新的基地址
L.listsize += LISTCREMENT;//增加储存容量
}
p = &(L.elem[i - 1]);
for (Elemtype* q = &L.elem[L.Length - 1]; q >= p; --q) {
*(q + 1) = *q;//将i-1元素后移
}
*p = e;
++L.Length;//表长加一
return OK;
}
//删除线性表中的第i个元素,并用e返回其值
status ListDelete(SqList& L, int i, Elemtype&e) {
Elemtype *p,*q;
if (i<1 || i>L.Length)
return Error;
p = &L.elem[i - 1];
e = *p;
p++;
for (q = L.elem + L.Length - 1; p<= q; p++)
*(p - 1) = *p;
--L.Length;
return OK;
}
//输出线性表中的数据;
status PrintfList(SqList L) {
Elemtype* p;
for (p = L.elem; p <= L.elem + L.Length - 1; p++) {
printf("%d", *p);
}
return OK;
}
int main() {
SqList L;
int n;
Elemtype e;
scanf_s("%d", &n);
InitList(L);
CreatList(L, n);
ListInsert(L, 2, 5);
ListDelete(L, 3, e);
PrintfList(L);
return 0;
}