线性表(List):零个或多个数据元素的有限序列
一. 线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素
结构代码:
#define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList;
可以看出,描述顺序存储结构需要三个属性:存储空间的起始位置,数组data;线性表的最大存储容量,MAXSIZE;线性表的当前容量,length。用数组存储顺序表意味着要分配固定长度的数组空间,由于线性表中可以进行插入和删除操作,因此线性表的长度应该小于等于数组的长度。
1. 获得元素操作完整代码 GetElem
#include<stdio.h> #define OK 1 #define ERROR 0 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList; //用ip返回L中第i个位置的数据元素的值 int GetElem(SqList L, int i, ElemType *e); int main() { ElemType *ip, e; int ListLength = 10; //大小为10的线性表 SqList List; int i; for(i = 0; i < ListLength; i++) //初始化线性表 { List.data[i] = i; } List.length = ListLength; ip = &e; //初始化指针 GetElem(List, 2, ip); printf("%d\n", *ip); } int GetElem(SqList L, int i, ElemType *ip) { if(L.length == 0 || i < 1 || i > L.length) { return ERROR; //失败 } *ip = L.data[i-1]; return OK; //成功 }
1. 插入操作
1)如果插入位置不合理,抛出异常
2)如果线性表长度大于等于数组长度,则抛出异常或动态增加容量
3)从最后一个元素开始向前遍历到第i个位置,分别将他们都向后移动一个位置
4)将要插入的元素插入位置i
5)表长增加1
完整代码实现如下:
#include<stdio.h> #define OK 1 #define ERROR 0 #define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; }SqList; //在L中的第i个位置之前插入元素e int ListInsert(SqList *L, int i, ElemType e); int main() { int ListLength = 10; //大小为10的线性表 SqList List; SqList *L; //初始化线性表 int i; for(i = 0; i < ListLength; i++) { List.data[i] = i + 1; } List.length = ListLength; L = &List; printf("%d\n", L->data[0]); ListInsert(L, 1, 100); printf("%d\n", L->data[0]); } int ListInsert(SqList *L, int i, ElemType e) { int j; if(i > L->length || i < 1 || L->length == MAXSIZE) { return ERROR; } //从最后向前遍历 for(j = L->length - 1; j >= i - 1; j--) { L->data[j+1] = L->data[j]; } //将新元素插入 L->data[i-1] = e; L->length++; return OK; }