線性表的順序表示和實現
Common.h
[cpp]
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
SqList.h
[cpp]
//------線性表的動態分配順序存儲結構--------
#include <stdlib.h>
#include "Common.h"
#define ElemType int
#define LIST_INIT_SIZE 100 //線性表存儲空間的初始分配量
#define LISTINCREMENT 10 //線性表存儲空間的分配增量
typedef struct{
ElemType* elem; //存儲空間基址
int length; //當前長度
int listsize; //當前分配的存儲容量(以sizeof(ElemType)為單位)
} SqList;
//基本操作
Status InitList(SqList &L);
//操作結果:構造一個空的線性表L。
Status DestroyList(SqList &L);
//初始條件:線性表L已存在。
//操作結果:銷毀線性表L。
Status ClearList(SqList &L);
//初始條件:線性表L已存在。
//操作結果:將L重置為空表。
bool ListEmpty(SqList L);
//初始條件:線性表L已存在。
//操作結果:若L為空表,則返回TRUE,否則返回FALSE。
int ListLength(SqList L);
//初始條件:線性表L已存在。
//操作結果:返回L中數據元素的個數。
Status GetElem(SqList L, int i, ElemType &e);
//初始條件:線性表L已存在,1<=i<=ListLength(L)。
//操作結果:用e返回L中第i個數據元素的值。
int LocateElem(SqList L, int e, bool (*equal)(ElemType, ElemType));
//初始條件:線性表L已存在,compare()是數據元素判定函數。
//返回L中第一個與e滿足關系compare()的數據元素的位序。若這樣的數據元素不存在,則返回值為0.
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e);
//初始條件:線性表L已存在。
//操作結果:若cur_e是L中的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗,pre_e無定義。
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e);
//初始條件:線性表L已存在。
//操作結果:若cur_e是L中的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗,next_e無定義。
Status ListInsert(SqList &L, int i, ElemType e);
//初始條件:線性表L已存在,1<=i<=ListLength(L)+1.
//操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1.
Status ListDelete(SqList &L, int i, ElemType &e);
//初始條件:線性表L已存在且非空,1<=i<=ListLength(L).
//操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1.
Status ListTraverse(SqList L, bool (*visit)(ElemType));
//初始條件:線性表L已存在
//操作結果:依次對L的每個元素調用函數visit().一旦visit()失敗,則操作失敗。
//------線性表的動態分配順序存儲結構--------
#include <stdlib.h>
#include "Common.h"
#define ElemType int
#define LIST_INIT_SIZE 100 //線性表存儲空間的初始分配量
#define LISTINCREMENT 10 //線性表存儲空間的分配增量
typedef struct{
ElemType* elem; //存儲空間基址
int length; //當前長度
int listsize; //當前分配的存儲容量(以sizeof(ElemType)為單位)
} SqList;
//基本操作
Status InitList(SqList &L);
//操作結果:構造一個空的線性表L。
Status DestroyList(SqList &L);
//初始條件:線性表L已存在。
//操作結果:銷毀線性表L。
Status ClearList(SqList &L);
//初始條件:線性表L已存在。
//操作結果:將L重置為空表。
bool ListEmpty(SqList L);
//初始條件:線性表L已存在。
//操作結果:若L為空表,則返回TRUE,否則返回FALSE。
int ListLength(SqList L);
//初始條件:線性表L已存在。
//操作結果:返回L中數據元素的個數。
Status GetElem(SqList L, int i, ElemType &e);
//初始條件:線性表L已存在,1<=i<=ListLength(L)。
//操作結果:用e返回L中第i個數據元素的值。
int LocateElem(SqList L, int e, bool (*equal)(ElemType, ElemType));
//初始條件:線性表L已存在,compare()是數據元素判定函數。
//返回L中第一個與e滿足關系compare()的數據元素的位序。若這樣的數據元素不存在,則返回值為0.
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e);
//初始條件:線性表L已存在。
//操作結果:若cur_e是L中的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗,pre_e無定義。
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e);
//初始條件:線性表L已存在。
//操作結果:若cur_e是L中的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗,next_e無定義。
Status ListInsert(SqList &L, int i, ElemType e);
//初始條件:線性表L已存在,1<=i<=ListLength(L)+1.
//操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1.
Status ListDelete(SqList &L, int i, ElemType &e);
//初始條件:線性表L已存在且非空,1<=i<=ListLength(L).
//操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1.
Status ListTraverse(SqList L, bool (*visit)(ElemType));
//初始條件:線性表L已存在
//操作結果:依次對L的每個元素調用函數visit().一旦visit()失敗,則操作失敗。
SqList.cpp
[cpp]
#include <malloc.h>
#include "SqList.h"
Status InitList(SqList &L){
//操作結果:構造一個空的線性表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;
}//InitList
Status DestroyList(SqList &L){
//操作結果:銷毀線性表L。
free(&L);
return OK;
}
Status ClearList(SqList &L) {
//操作結果:將L重置為空表。
L.length = 0;
return OK;
}
bool ListEmpty(SqList L){
//操作結果:若L為空表,則返回TRUE,否則返回FALSE。
if(0 == L.length)
return true;
else return false;
}
int ListLength(SqList L){
//操作結果:返回L中數據元素的個數。
return L.length;
}
Status GetElem(SqList L, int i, ElemType &e){
//1<=i<=ListLength(L)。
//操作結果:用e返回L中第i個數據元素的值。
if(i < 1 || i>=L.length) return ERROR;
e = L.elem[i-1];
return OK;
}
int LocateElem(SqList L, ElemType e, bool (*equal)(ElemType, ElemType)){
//compare()是數據元素判定函數。
//返回L中第一個與e滿足關系compare()的數據元素的位序。若這樣的數據元素不存在,則返回值為0.
int i = 1;
ElemType* p = L.elem;
while(i <= L.length && !(*equal)(*p++, e)) ++i;
if(i <= L.length) return i;
else return 0;
}
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e){
//操作結果:若cur_e是L中的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗,pre_e無定義。
int i=1;
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;
if(i<2 || i>L.length)
return ERROR;
pre_e = L.elem[i-2];
return OK;
}
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e){
//操作結果:若cur_e是L中的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗,next_e無定義。
int i=1;
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;
if(i<2 || i>L.length)
return ERROR;
next_e = L.elem[i];
return OK;
}
Status ListInsert(SqList &L, int i, ElemType e){
//1<=i<=ListLength(L)+1.
//操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1.
if(i < 1 || i>L.length+1) return ERROR; //i值不合法
if(L.length >= L.listsize) {
ElemType * newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElemType * q = &(L.elem[i-1]); //q為插入位置
ElemType * p;
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p; //右移
*q = e;
++L.length;
return OK;
}//ListInsert
Status ListDelete(SqList &L, int i, ElemType &e){
//1<=i<=ListLength(L).
//操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1.
if(i<1 || i>L.length) return ERROR;
ElemType* p = &(L.elem[i-1]);
e = *p;
ElemType* q = L.elem + L.length - 1;
for(++p;p<=q;++p) *(p-1) = *p;
--L.length;
return OK;
}
Status ListTraverse(SqList L, bool (*visit)(ElemType)){
//操作結果:依次對L的每個元素調用函數visit().一旦visit()失敗,則操作失敗。
int i=1;
ElemType* p = L.elem;
while(i <= L.length && (*visit)(*p++)) ++i;
return OK;
}
#include <malloc.h>
#include "SqList.h"
Status InitList(SqList &L){
//操作結果:構造一個空的線性表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;
}//InitList
Status DestroyList(SqList &L){
//操作結果:銷毀線性表L。
free(&L);
return OK;
}
Status ClearList(SqList &L) {
//操作結果:將L重置為空表。
L.length = 0;
return OK;
}
bool ListEmpty(SqList L){
//操作結果:若L為空表,則返回TRUE,否則返回FALSE。
if(0 == L.length)
return true;
else return false;
}
int ListLength(SqList L){
//操作結果:返回L中數據元素的個數。
return L.length;
}
Status GetElem(SqList L, int i, ElemType &e){
//1<=i<=ListLength(L)。
//操作結果:用e返回L中第i個數據元素的值。
if(i < 1 || i>=L.length) return ERROR;
e = L.elem[i-1];
return OK;
}
int LocateElem(SqList L, ElemType e, bool (*equal)(ElemType, ElemType)){
//compare()是數據元素判定函數。
//返回L中第一個與e滿足關系compare()的數據元素的位序。若這樣的數據元素不存在,則返回值為0.
int i = 1;
ElemType* p = L.elem;
while(i <= L.length && !(*equal)(*p++, e)) ++i;
if(i <= L.length) return i;
else return 0;
}
Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e){
//操作結果:若cur_e是L中的數據元素,且不是第一個,則用pre_e返回它的前驅,否則操作失敗,pre_e無定義。
int i=1;
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;
if(i<2 || i>L.length)
return ERROR;
pre_e = L.elem[i-2];
return OK;
}
Status NextElem(SqList L, ElemType cur_e, ElemType &next_e){
//操作結果:若cur_e是L中的數據元素,且不是最後一個,則用next_e返回它的後繼,否則操作失敗,next_e無定義。
int i=1;
while(i <= L.length && !(cur_e==L.elem[i-1])) ++i;
if(i<2 || i>L.length)
return ERROR;
next_e = L.elem[i];
return OK;
}
Status ListInsert(SqList &L, int i, ElemType e){
//1<=i<=ListLength(L)+1.
//操作結果:在L中第i個位置之前插入新的數據元素e,L的長度加1.
if(i < 1 || i>L.length+1) return ERROR; //i值不合法
if(L.length >= L.listsize) {
ElemType * newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElemType * q = &(L.elem[i-1]); //q為插入位置
ElemType * p;
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1) = *p; //右移
*q = e;
++L.length;
return OK;
}//ListInsert
Status ListDelete(SqList &L, int i, ElemType &e){
//1<=i<=ListLength(L).
//操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1.
if(i<1 || i>L.length) return ERROR;
ElemType* p = &(L.elem[i-1]);
e = *p;
ElemType* q = L.elem + L.length - 1;
for(++p;p<=q;++p) *(p-1) = *p;
--L.length;
return OK;
}
Status ListTraverse(SqList L, bool (*visit)(ElemType)){
//操作結果:依次對L的每個元素調用函數visit().一旦visit()失敗,則操作失敗。
int i=1;
ElemType* p = L.elem;
while(i <= L.length && (*visit)(*p++)) ++i;
return OK;
}
main.cpp
[cpp]
#include <stdio.h>
#include "SqList.h"
bool equal(int a, int b){
if(a == b)
return true;
return false;
}
bool visit(ElemType e){
printf(" %d", e);
return true;
}
int main()
{
SqList L;
ElemType e;
ElemType pre_e;
ElemType next_e;
InitList(L);
if(ListEmpty(L))
printf("kong\n");
for(int i=0;i<30;i++){
e = i+1;
ListInsert(L, i+1, e);
}
e = 15;
printf("15所在的位置為: %d\n", LocateElem(L, 15, equal));
PriorElem(L, e, pre_e);
NextElem(L, e, next_e);
printf("e的前驅為:%d\n", pre_e);
printf("e的後驅為:%d\n", next_e);
GetElem(L, 22, e);
printf("第22個數為:%d\n", e);
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
printf("List length is:%d\n", ListLength(L));
ClearList(L);
printf("清空\n");
printf("List length is:%d\n", ListLength(L));
if(ListEmpty(L))
printf("kong\n");
ListInsert(L, 1, 3);
ListInsert(L, 2, 7);
ListInsert(L, 3, 9);
ListInsert(L, 4, 1);
ListInsert(L, 5, 44);
printf("List length is:%d\n", ListLength(L));
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
ListDelete(L, 3, e);
printf("所刪除的值為: %d\n", e);
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
printf("xiaohui:\n");
DestroyList(L);
system("pause");
return 0;
}
#include <stdio.h>
#include "SqList.h"
bool equal(int a, int b){
if(a == b)
return true;
return false;
}
bool visit(ElemType e){
printf(" %d", e);
return true;
}
int main()
{
SqList L;
ElemType e;
ElemType pre_e;
ElemType next_e;
InitList(L);
if(ListEmpty(L))
printf("kong\n");
for(int i=0;i<30;i++){
e = i+1;
ListInsert(L, i+1, e);
}
e = 15;
printf("15所在的位置為: %d\n", LocateElem(L, 15, equal));
PriorElem(L, e, pre_e);
NextElem(L, e, next_e);
printf("e的前驅為:%d\n", pre_e);
printf("e的後驅為:%d\n", next_e);
GetElem(L, 22, e);
printf("第22個數為:%d\n", e);
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
printf("List length is:%d\n", ListLength(L));
ClearList(L);
printf("清空\n");
printf("List length is:%d\n", ListLength(L));
if(ListEmpty(L))
printf("kong\n");
ListInsert(L, 1, 3);
ListInsert(L, 2, 7);
ListInsert(L, 3, 9);
ListInsert(L, 4, 1);
ListInsert(L, 5, 44);
printf("List length is:%d\n", ListLength(L));
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
ListDelete(L, 3, e);
printf("所刪除的值為: %d\n", e);
printf("遍歷:");
ListTraverse(L, visit);
printf("\n");
printf("xiaohui:\n");
DestroyList(L);
system("pause");
return 0;
}結果預覽: