线性表中的顺序表的实现
也是数据结构中最基础的
1 线性表结构2 基本 *** 作函数3 整体代码
test1.cSeqList.h 4 运行结果5 附加题
1 线性表结构主要是一个基地址,相当于一个指针,也可以设为一个数组,效果是一样的。
typedef struct List { ElemType *list; //存储空间基地址 int size; //当前长度 int MaxSize; //当前分配的存储容量 } SeqList;2 基本 *** 作函数
- 初始化线性表
void InitList(SeqList *sq) { sq->list = (ElemType *)malloc(MAXSize*sizeo(ElemType)); sq->size = 0; sq->MaxSize = MAXSize; }
- 清除线性表
void ClearList(SeqList *sq) { sq->size = 0; }
- 求线性表长度
int LengthList(SeqList *sq) { return sq->size; }
bool InsertList(SeqList *sq, ElemType item, int pos) { int i; if (sq->size == MAXSize) { return false; // 当元素个数已满时,返回0代表插入失败 } for (i = sq->size; i > pos-1; --i) { sq->list[i] = sq->list[i - 1]; // 从第pos个数开始,每个数往后移动一个位置,注意必须逆序 } sq->list[pos-1] = item; // 第pos个数变成item sq->size++; // 插入一个数,长度加1 return true; // 插入成功返回1 }
这里用枚举类型,让false代表0,true为1
typedef enum { false, true } bool;
- 找元素
在线性表L中求序号为pos的元素,该元素作为函数值返回
ElemType GetList(SeqList *sq, int pos) { return sq->list[pos-1]; }
- 打印顺序表
void printList(SeqList *sq) { for (int i = 0; i < sq->size; i++) { printf("%dt", sq->list[i]); } }3 整体代码
该程序分为两个文件,“SeqList.h"与"test1.c”
将数据结构类型定义(typedef)部分与基础 *** 作函数放在头文件SeqList.h
主函数以及其他部分放在test1.c中
为检验代码可行性,设计main()函数验证功能:接收元素组成顺序表,打印顺序表,求和
#includeSeqList.h#include typedef int ElemType; #define MAXSize 10 #include "SeqList.h" //引用头文件 int main(void) { SeqList *myList = (SeqList *)malloc(sizeof(SeqList)); int i = 1, x, sum = 0, n; InitList(myList); printf("请输入顺序表(输入-1结束):"); scanf("%d", &x); while (x != -1) { if (InsertList(myList, x, i) == 0) { printf("错误!n"); return 0; } i++; scanf("%d", &x); } printList(myList); printf("n"); n = LengthList(myList); for (i = 1; i <= n; i++) { x = GetList(myList, i); sum += x; } printf("顺序表的和是%dn", sum); ClearList(myList); return 0; }
typedef struct List { ElemType *list; //存储空间基地址 int size; //当前长度 int MaxSize; //当前分配的存储容量 } SeqList; typedef enum { false, true } bool; void InitList(SeqList *sq) { //初始化线性表 sq->list = (ElemType *)malloc(MAXSize*sizeof(ElemType)); sq->size = 0; sq->MaxSize = MAXSize; } void ClearList(SeqList *sq) { //清除线性表 sq->size = 0; } int LengthList(SeqList *sq) { //求线性表长度 return sq->size; } bool InsertList(SeqList *sq, ElemType item, int pos) {//按给定条件pos向线性表插入一个元素 int i; if (sq->size == MAXSize) { return false; // 当元素个数已满时,返回0代表插入失败 } for (i = sq->size; i > pos-1; --i) { sq->list[i] = sq->list[i - 1]; // 从第pos个数开始,每个数往后移动一个位置,注意必须逆序 } sq->list[pos-1] = item; // 第pos个数变成item sq->size++; // 插入一个数,长度加1 return true; // 插入成功返回1 } ElemType GetList(SeqList *sq, int pos) { //在线性表L中求序号为pos的元素,该元素作为函数值返回 return sq->list[pos-1]; } void printList(SeqList *sq) { for (int i = 0; i < sq->size; i++) { printf("%dt", sq->list[i]); } }4 运行结果 5 附加题
要求:编写函数bool DeleteElem(SeqList *L, int min, int max) 实现从顺序表中删除其值在给定值min和max之间(min < max)的所有元素,要求把该函数添加到文件SeqList.h中,并在主函数文件test1.cp中添加相应语句进行测试。依次遍历元素,若在范围内的,进行删除,每次删除后都会导致后面的元素全部前进,注意是正序将函数添加到SeqList.h中
bool DeleteElem(SeqList *sq, int min, int max) { if(min>=max) { printf("min>=max error"); return false; } for (int i = 0; i < sq->size; i++) { if (sq->list[i]>=min && sq->list[i]<=max) { for (int m = i; m < sq->size; m++) //后面元素全部前进一个,注意是正序 { sq->list[m] = sq->list[m+1]; } sq->size--; i--; } } return true; }
主函数
test1.c添加附加部分通过print函数检验是否删除成功测试删除所有在3-7之间的元素
#include#include typedef int ElemType; #define MAXSize 10 #include "SeqList.h" int main(void) { SeqList *myList = (SeqList *)malloc(sizeof(SeqList)); int i = 1, x, sum = 0, n, min, max; InitList(myList); printf("请输入顺序表(输入-1结束):"); scanf("%d", &x); while (x != -1) { if (InsertList(myList, x, i) == 0) { printf("错误!n"); return 0; } i++; scanf("%d", &x); } printList(myList); printf("n"); //附加部分 min = 3; max = 7; if (DeleteElem(myList, min, max) == 0) { printf("错误"); return 0; } printList(myList); printf("n"); // n = LengthList(myList); // for (i = 1; i <= n; i++) // { // x = GetList(myList, i); // sum += x; // } // printf("顺序表的和是%dn", sum); // ClearList(myList); return 0; }
运行结果
成功删除了3-7之间的元素
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)