抽象資料型別線性表的定義與實現
阿新 • • 發佈:2018-12-09
最近剛剛上完資料結構的第一章,好久沒有寫線性表了,正好藉著老師的作業溫習一下,主程式實現的就是簡單的list有序合併。不多比比,直接上程式碼
第一部分 de.hpp檔案
//
// main.cpp
// test
//
// Created by 蔡鵬 on 2018/9/4.
// Copyright © 2018年 蔡鵬. All rights reserved.
//
#ifndef de_hpp
#define de_hpp
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 //儲存空間初始分配量
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 //不可實施
#define OVERFLOW -2 //溢位elem
typedef int ElemType;//ElemType根據實際情況而定,這裡假設為int
typedef int Status;
typedef struct
{
ElemType *elem;//陣列儲存資料元素,最大值為MAXSIZE
int listsize ;//當前分配的儲存容量
int length;//線性表當前長度
}SqList;
void CreateList(SqList *L, ElemType a[], int n); //利用陣列初始化Sqlist
Status InitList(SqList *L); //初始化,動態分配一塊儲存空間
Status DestroyList(SqList *L); //釋放這一段儲存空間(撤銷對應於動態)
Status ClearList(SqList *L);
Status ListEmpty(SqList L);
Status ListLength(SqList L);
Status GetElem(SqList L, int i, int *e);
Status LocateList(SqList L, int e); //在表中查詢值為e的元素
Status PriorElem(SqList L, int cur_e, int *pri_e); //求當前元素的前驅
Status NextElem(SqList L, int cur_e, int *Nex_e); //求當前元素的後繼
Status ListInsert(SqList *L, int i, int e); //插入操作
Status ListDelete(SqList *L, int i, int *e); //刪除操作
Status TravelList(SqList L); //便歷操作
#endif /* de_hpp */
第二部分 defc.hpp
//
// main.cpp
// test
//
// Created by 蔡鵬 on 2018/9/4.
// Copyright © 2018年 蔡鵬. All rights reserved.
//
#include "de.hpp"
void CreateList(SqList *L, ElemType a[5], int n){
int i;
for (i=0; i<n; i++){
*(L->elem+i) = a[i];
}
L->length=n;
}
Status InitList(SqList *L){//創造一個空的線形表
L->elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);//錯誤退出
L->length = 0;
L->listsize = MAXSIZE;
return OK;
}
Status DestroyList(SqList *L){
free(L->elem); //釋放空間
L->elem = NULL; //將指標置空
L->length = 0; //當前元素個數為0
L->listsize = 0; //表長為0
return OK;
}
Status ClearList(SqList *L){
L->length = 0;
return OK;
}
Status ListEmpty(SqList L){
if (L.length == 0)
return TURE;
else
return FALSE;
}
Status ListLength(SqList L){
return L.length;
}
Status GetELem(SqList L,int i,int *e){
*e = *(L.elem + i);
return TURE;
}
Status LocateList(SqList L,int e){
int i;
int * p = L.elem;
for (i=0; i<L.length; i++, p++){
if (*p == e)
return i;
}
return FALSE;
}
Status PriorElem(SqList L ,int cur_e,int *pri_e){
int i;
int *p = L.elem;
for (i=0; i<L.length; i++,p++){ //順序表長度已知,故用for迴圈
if (i==0 && *p==cur_e)
return FALSE;
if (*p == cur_e){ //找到了當前元素且不是第一個元素,
*pri_e = *--p; //將其前驅賦給引用引數
return TURE;
}
}
return FALSE;
}
Status NextElem(SqList L, int cur_e, int *Nex_e){
int i;
int *p = L.elem;
for(i = 0;i<L.length;i++,p++){
if(i==L.length-1 && *p == cur_e)
return FALSE;
if(*p == cur_e){
*Nex_e = *++p;
return TURE;
}
}
return FALSE;
}
Status ListInsert(SqList *L, int i, int e){
int *p, *q;
p = L->elem + i ; //p指向插入的位置
q = L->elem + L->length - 1; //q指向表中元素最後一個位置
for (; q>=p; q--) //從最後一個元素開始依次向後移動表中元素
*(q+1) = *q;
*(q+1) = e; //插入元素
L->length++; // 表長增一
return TURE;
}
Status ListDelete(SqList *L, int i, int *e){
int *p, *q;
if (i<1 || i>L->length)
return FALSE;
p = L->elem + i - 1; //p指向要刪除的元素的位置
q = L->elem + L->length - 1; //q指向表中最後一個元素位置
*e = *p; //將要刪除的元素儲存起來
for (; p<=q; p++) //從要刪除元素的後面一個元素開始移動元素
*p = *(p+1);
L->length--; //表長減一
return TURE;
}
Status TravelList(SqList L){
int i;
int *p = L.elem;
for (i=0; i<L.length; i++,p++){
printf("第%d個元素為:%d\n", i, *p);
}
return TURE;
}
第三部分 main 主程式
//
// main.cpp
// test
//
// Created by 蔡鵬 on 2018/9/4.
// Copyright © 2018年 蔡鵬. All rights reserved.
//
#include "defc.hpp"
void MergeList(SqList La,SqList Lb,SqList &Lc){
int i,j,k,La_len,Lb_len,ai,bj;
i=j=0;
k=0;
La_len = La.length;
Lb_len = Lb.length;
while(i<La_len&&j<Lb_len){
GetELem(La, i, &ai);
GetELem(Lb, j, &bj);
if(ai<=bj) {ListInsert(&Lc, k++, ai);++i;}
else{ListInsert(&Lc, k++, bj);++j;}
}
while (i<La_len) {
GetELem(La, i++, &ai);
ListInsert(&Lc, k++, ai);
}
while (j<Lb_len) {
GetELem(Lb, j++, &bj);
ListInsert(&Lc, k++, bj);
}
}
int main(){
int la[5] = {1,3,5,7,9};
int lb[5] = {2,3,6,8,10};
SqList La,Lb,Lc;
InitList(&La);
InitList(&Lb);
InitList(&Lc);
CreateList(&La, la, 5);
CreateList(&Lb, lb, 5);
MergeList(La, Lb, Lc);
TravelList(Lc);
}
結果圖