一.线性表
线性表的抽象数据类型定义如下:
ADT 线性表(List)
Data
{a1,a2,a3,a4,a5},除了第一个元素以外,每个元素只有一个前驱元素,也只有一个后驱元素。
Qperation
InitList(* L) 初始化操作,建立一个空的线性表L
ListEmpty(L) 判断线性表是否为空,返回Tre和False
ClearList(*L) 线性表清空
GetElem(L, i, *e) 将线性表L中的第i个位置的元素返回给e
ListInsert(*L, i, e) 在线性表L中的第i个位置插入新元素e
ListDelete(*L, i, *e) 删除线性表第i个位置的元素,并用e返回
ListLength(L) 返回线性表L的元素个数
endADT
1.顺序存储
#define MAXSIZE 50
#define SUCCESS 0
#define FAIL 1
typedef int Status;
typedef int ElemType;
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
Status GetElem(SqList L, int i, ElemType *e)
{
if (L.length == 0 || i < 1 || i > L.length) {
return FAIL;
}
*e = L.data[i-1];
return SUCCESS;
}
Status InsertElem(SqList *L, int i, ElemType e)
{
int k;
if (L->length == MAXSIZE) {
return FAIL;
}
if (i < 1 || i > L->length) {
return FAIL;
}
if (i <= L->length) {
for (k = L->length - 1 ; k >= i - 1; k--) {
L->data[k+1] = L->data[k];
}
}
L->data[i-1] = e;
L->length++;
return SUCCESS;
}
Status ListDelete(SqList *L, int i, ElemType *e)
{
int k;
if (L->length == 0) {
return FAIL;
}
if (i < 1 || i > L->length) {
return FAIL;
}
*e = L->data[i-1];
if (i < L->length) {
for (k = i - 1; k < L->length - 1; k++) {
L->data[k] = L->data[k+1];
}
}
L->length--;
return SUCCESS;
}
Status PrintList(SqList L) {
if (L.length <= 0)
return FAIL;
int i;
for(i = 0; i < L.length; i++) {
printf("List[%d] = %d\n", i, L.data[i]);
}
return SUCCESS;
}
- 优点:可以快速存取表中任一位置的元素,存取读取的复杂度为O(1)
- 缺点:插入和删除需要移动大量元素,当线性表长度变化时,难以确定存储空间的容量,造成存储碎片。
2.链表存储
#define MAXSIZE 50
#define SUCCESS 0
#define FAIL 1
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
Status GetElem(LinkList head, int i, ElemType *e)
{
int j;
LinkList p;
p = head;
j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return FAIL;
}
*e = p->data;
return SUCCESS;
}
Status ListInsert(LinkList *head, int i, ElemType e)
{
int j;
LinkList p, s;
p = *head;
j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (p == NULL) {
return FAIL;
}
s = (LinkList)malloc(sizeof(struct Node));
s->data = e;
s->next = p->next;
p->next = s;
return SUCCESS;
}
Status ListDelete(LinkList head, int i, ElemType *e)
{
int j;
LinkList p, q;
p = head;
j = 1;
while (p->next && j < i) {
p = p->next;
j++;
}
if (p->next == NULL) {
return FAIL;
}
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return SUCCESS;
}
Status PrintList(LinkList head)
{
LinkList p;
p = head;
if (p == NULL) {
return FAIL;
}
while (p) {
printf("%d\n", p->data);
p = p->next;
}
printf("\n");
return SUCCESS;
}
Status CreateListTail(LinkList *L, int n)
{
LinkList p, r;
*L = (LinkList)malloc(sizeof(Node));
r = *L;
int i = 0;
for (i = 0; i < n-1; i++) {
p = (LinkList)malloc(sizeof(Node));
p->data = i;
r->next = p;
r = p;\
}
r->next = NULL;
}
Status clearList(LinkList *L)
{
LinkList p;
while (*L) {
p = *L;
*L = (*L)->next;
free(p);
}
*L = NULL;
return SUCCESS;
}