Created
December 17, 2016 07:20
-
-
Save limboinf/ca7dcec7eff97a8734adebb0168aaa2e to your computer and use it in GitHub Desktop.
数据结构:线性表之顺序表
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Created by 方朋 on 16/12/15. | |
// | |
#ifndef DATA_STRUCTURES_GLOBAL_H | |
#define DATA_STRUCTURES_GLOBAL_H | |
#define OK 1 | |
#define ERROR 1 | |
#define TRUE 1 | |
#define FALSE 0 | |
typedef int Status; | |
#endif //DATA_STRUCTURES_GLOBAL_H |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include "global.h" | |
// 线性表的顺序存储结构 | |
// 这里第i个元素为顺序线性表L的i-1下标 | |
#define MAXSIZE 20 | |
typedef int ElemType; | |
typedef struct { | |
ElemType data[MAXSIZE]; // 数组长度最大值 | |
int length; // 线性表当前长度 | |
}SqList; | |
/* 初始化顺序线性表 */ | |
Status InitList(SqList *L) | |
{ | |
L->length=0; | |
return OK; | |
} | |
/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */ | |
Status ClearList(SqList *L) | |
{ | |
return InitList(L); | |
} | |
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */ | |
int ListLength(SqList L) | |
{ | |
return L.length; | |
} | |
/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ | |
Status ListEmpty(SqList L) | |
{ | |
if(L.length==0) | |
return TRUE; | |
else | |
return FALSE; | |
} | |
/* | |
* Status是函数类型, 其值为结果状态码如OK | |
* 初始条件:顺序线性表L存在,且 1<=i<=ListLength(L) | |
* 操作结果:用e返回L中第i个元素的值 | |
*/ | |
Status GetElem(SqList L, int i, ElemType *e) | |
{ | |
if(L.length == 0 || i > L.length || i < 1) | |
return ERROR; | |
*e = L.data[i-1]; | |
return OK; | |
} | |
/* 初始条件:顺序线性表L已存在 */ | |
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */ | |
/* 若这样的数据元素不存在,则返回值为0 */ | |
int LocateElem(SqList L,ElemType e) | |
{ | |
int i; | |
if (L.length==0) return 0; | |
for(i=0; i<L.length; i++) | |
{ | |
if (L.data[i]==e) | |
break; | |
} | |
if(i >= L.length) return 0; | |
return i+1; | |
} | |
/* | |
* 初始条件: 顺序线性表L存在, 且 1<=i<=ListLength(L) | |
* 操作结果: 在L中第i个位置之前插入新的元素e, L长度加1 | |
*/ | |
Status ListInsert(SqList *L, int i, ElemType e) | |
{ | |
int k; | |
/*顺序表满则不能插入*/ | |
if (L->length == MAXSIZE) | |
return ERROR; | |
/*如果i不在范围内*/ | |
if (i < 1 || i > L->length + 1) | |
return ERROR; | |
/*如果i不在队尾*/ | |
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 OK; | |
} | |
/* | |
* 初始条件: 顺序线性表L存在, 且 1<=i<=ListLength(L) | |
* 操作结果: 删除L的第i个数据元素并用e返回其值,L的长度减1 | |
*/ | |
Status ListDelete(SqList *L, int i, ElemType *e) | |
{ | |
int k; | |
/*如果表为空则不能删除*/ | |
if (L->length == 0) | |
return ERROR; | |
/*如果i的位置范围不对*/ | |
if (i < 1 || i > L->length) | |
return ERROR; | |
*e = L->data[i - 1]; | |
/*如果i不在队尾*/ | |
if (i < L->length) { | |
/* 将删除位置的后继元素前移 */ | |
for (k = i; k < L->length; ++k) { | |
L->data[k - 1] = L->data[k]; | |
} | |
} | |
L->length--; | |
return OK; | |
} | |
/* 初始条件:顺序线性表L已存在 */ | |
/* 操作结果:依次对L的每个数据元素输出 */ | |
Status ListTraverse(SqList L) | |
{ | |
int i; | |
for(i=0;i<L.length;i++) | |
printf("%d ", L.data[i]); | |
printf("\n"); | |
return OK; | |
} | |
/* | |
* 合并两个线性表 | |
* 操作结果: 将Lb表合并到La | |
*/ | |
void unionL(SqList *La, SqList Lb) | |
{ | |
int La_len, Lb_len, i; | |
ElemType e; | |
La_len = ListLength(*La); | |
Lb_len = ListLength(Lb); | |
for (i = 1; i <= Lb_len; i++) | |
{ | |
GetElem(Lb, i, &e); | |
if (!LocateElem(*La, e)) | |
ListInsert(La, ++La_len, e); | |
} | |
} | |
int main(int argc, char **argv) | |
{ | |
SqList L; | |
ElemType e; | |
Status i; | |
int j,k; | |
// 初始化一个顺序表L | |
i=InitList(&L); | |
if (i == 1) | |
printf("初始化L成功, 长度:L.length=%d\n",L.length); | |
// 插入1~5 | |
for(j=1;j<=5;j++) | |
ListInsert(&L,1,j); | |
// 打印L元素 | |
printf("在L的表头依次插入1〜5后:L.data="); | |
ListTraverse(L); | |
printf("L.length=%d \n",L.length); | |
// 判断是否为空 | |
i=ListEmpty(L); | |
printf("L是否空:i=%d(1:是 0:否)\n",i); | |
// 清空L | |
ClearList(&L); | |
printf("清空L后:L.length=%d\n",L.length); | |
// 判断是否为空表 | |
i=ListEmpty(L); | |
printf("L是否空:i=%d(1:是 0:否)\n",i); | |
// 连续插入1~10 | |
for(j=1;j<=10;j++) | |
ListInsert(&L,j,j); | |
printf("在L的表尾依次插入1〜10后:L.data="); | |
ListTraverse(L); | |
printf("L.length=%d \n",L.length); | |
// 在1和10位置处插入100和999 | |
ListInsert(&L,1, 100); | |
printf("在L的表头插入100后:L.data="); | |
ListInsert(&L, 10, 999); | |
ListTraverse(L); | |
printf("L.length=%d \n",L.length); | |
GetElem(L, 10, &e); | |
printf("第10个元素的值为:%d\n",e); | |
// 返回L中第1个与e满足关系的数据元素的位序。 | |
for(j=3; j<=4; j++) | |
{ | |
k=LocateElem(L,j); | |
if(k) | |
printf("第%d个元素的值为%d\n",k,j); | |
else | |
printf("没有值为%d的元素\n",j); | |
} | |
k=ListLength(L); /* k为表长 */ | |
for(j = k + 1; j >= k;j--) | |
{ | |
i=ListDelete(&L,j,&e); /* 删除第j个数据 */ | |
if(i==ERROR) | |
printf("删除第%d个数据失败\n",j); | |
else | |
printf("删除第%d个的元素值为:%d\n",j,e); | |
} | |
printf("依次输出L的元素:"); | |
ListTraverse(L); | |
j=5; | |
ListDelete(&L,j,&e); /* 删除第5个数据 */ | |
printf("删除第%d个的元素值为:%d\n",j,e); | |
printf("依次输出L的元素:"); | |
ListTraverse(L); | |
//构造一个有10个数的Lb | |
SqList Lb; | |
i=InitList(&Lb); | |
for(j=6;j<=15;j++) | |
i=ListInsert(&Lb,1,j); | |
// 合并 | |
unionL(&L,Lb); | |
printf("依次输出合并了Lb的L的元素:"); | |
ListTraverse(L); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment