实现顺序表各种基本运算的算法

编写一个头文件SqList.h,实现顺序表的各种基本操作,并在此基础上设计一个主程序(exp2_1.cpp)完成如下功能:

  1. 初始化顺序表L
  2. 依次采用尾插法插入a,b,c,d,e元素
  3. 输出顺序表L
  4. 输出顺序表L的长度
  5. 判断顺序表L是否为空
  6. 输出顺序表L的第3个元素
  7. 输出元素a的位置
  8. 在第4个元素位置上插入f元素
  9. 输出顺序表L
  10. 删除L的第3个元素
  11. 输出顺序表L
  12. 释放顺序表            

头文件

/*文件名:SqList.h*/
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>

# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0
# define INFEASIBLE -1
# define OVERFLOW -2

//定义函数返回类型
typedef int Status;
# define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
# define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef char ElemType; //定义数据元素的类型为字符型


//定义顺序表的存储结构
typedef struct
{
	ElemType* elem;
	int length;
	int listsize;
}SqList;


//构造一个空的顺序表L
Status InitList(SqList &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;
}


int DestroyList(SqList &L)
{
	if(!L.elem)
	{
		return ERROR;  //表不存在
	}
	free(L.elem);      //释放内存
}


//判断顺序表是否为空,为空就返回true,否则返回false
Status ListEmpty(SqList &L)
{
	if(!L.elem)
	{
		return ERROR;  //表不存在
	}
	if(L.length == 0)
		return TRUE;
	else
		return FALSE;
}


//返回线性表L的长度
int ListLength(SqList &L)
{
	if(!L.elem)
	{
		return ERROR;
	}
	int i;
	while(i < L.length)
	{
		i++;
	}
	return L.length;
}


//打印单链表中的元素
void DispList(SqList &L)
{
	int i;
	if(ListEmpty(L))
		printf("数组为空");
	for(i = 0 ; i < 10 ; i++)
		printf("%c" , L.elem[i]);
		printf("%c\n");
}


//从顺序表L中查找第i个元素,由参数e返回其元素的值
Status GetElem(SqList L , int i , char &e)
{
	if(!L.elem)
	{
		return ERROR;
	}
	if(i<1 || i>=L.length-1)
	{
		return ERROR;     //i值不合法
	}
	char *q = L.elem;
	e = *(q + i - 1);     //把第i个元素给e
	return OK;
}


//在顺序表L中查找元素e的位置,不存在则返回0
int LocateElem(SqList L , int e)
{
	if(!L.elem)
	{
		return ERROR;
	}
	int i = 1;
	char *p = L.elem;
	while(i<L.length && *p++!=e)  //查找与e相等的值的位置
	{
		++i;
	}
	if(i <= L.length) //判断i的值在不在L.length里面
	{
		return i;
	}
	return 0;
}


//在顺序表L中第i个位置前插入元素e
Status ListInsert(SqList &L , int i , char e)
{
	int k;
	if(!L.elem)
	{
		return ERROR;
	}
	if(i>L.length+1 || i<1)
	{
		return ERROR;    //i值不合法
	}
	if(L.length >= L.listsize)
	{
		char *newbase;   //空间不足,重新分配
		newbase = (char*)realloc(L.elem , sizeof(char)*(L.listsize + LISTINCREMENT));
		L.elem = newbase;
		if(!L.elem)
		{
			return OVERFLOW; //分配失败
		}
		L.elem = newbase;
		L.listsize+=LISTINCREMENT; //新空间容量
	}
//插入元素e
	for(k = L.length-1 ; k >= i-1 ; k--)
		L.elem[k+1] = L.elem[k];
	L.elem[i-1] = e;
	L.length++;                //多一个元素长度加1
	return OK;
}


//在顺序表L中删除第i个值并用e返回这个值
Status ListDelete(SqList &L , int i , char &e)
{
	int k;
	if(!L.elem)
	{
		return ERROR;
	}
	if(i<1 || i>L.length)
	{
		return ERROR;  //i值不合法
	}
	e = L.elem[i-1];
	for(k = i ; k <= L.length ; k++)  //将自i-1后面的所有元素向前移动一位
		L.elem[k-1] = L.elem[k];
	L.length--;        //当遍历到L.length即最后一个元素的下一个元素时,将空元素赋给最后一个元素(L.length-1),然后链表L长度减1
	return OK;
}

主函数

# include"SqList.h"
int main()
{
	SqList(L);
	ElemType e;
	printf("初始化顺序表L\n");
	InitList(L);
	printf("依次采用尾插法插入a , b , c , d , e元素\n");
	ListInsert(L , 1 , 'a');
	ListInsert(L , 2 , 'b');
	ListInsert(L , 3 , 'c');
	ListInsert(L , 4 , 'd');
	ListInsert(L , 5 , 'e');
	printf("输出数序表L:");
	DispList(L);
	printf("顺序表长度L = %d\n" , L.length);
	printf("顺序表L为%s\n" , (ListEmpty(L)?"空":"非空"));
	GetElem(L , 3 , e);
	printf("顺序表的第3个元素 = %c\n" , e);
	printf("元素a的位置 = %d\n" , LocateElem(L , 'a'));
	printf("在第4个元素位置上插入f元素\n");
	ListInsert(L , 4 , 'f');
	printf("输出顺序表L:");
	DispList(L);
	printf("删除L的第3个元素\n");
	ListDelete(L , 3 , e);
	printf("输出顺序表L:");
	DispList(L);
	printf("释放顺序表L\n");
	free(L.elem);
}	

结果

 

编写一个名为`sqlist.cpp`的程序,用于实现顺序表(Sequential List)的基本操作和整体构建算法,通常会包含以下几个部分: 1. **数据结构定义**: - 定义一个顺序列表类,比如`SeqList`,它包含元素类型、大小、以及指向数组的指针等成员变量。 ```cpp class SeqList { private: T *data; // 存储元素的数组 int size; // 当前元素的数量 int capacity; // 序列的最大容量 public: // 构造函数和析构函数 SeqList(int initialCapacity = DEFAULT_CAPACITY); ~SeqList(); }; ``` 2. **初始化和构造函数**: - 初始化函数,例如,`SeqList()`需要分配初始容量的内存。 ```cpp SeqList::SeqList(int initialCapacity) : data(new T[initialCapacity]), size(0), capacity(initialCapacity) {} ``` 3. **插入和删除元素**: - `insert(T value)` 和 `remove(int index)` 方法用于在指定位置添加和移除元素。 ```cpp void SeqList::insert(int index, T value) { if (index < 0 || index > size) { throw std::out_of_range("Index out of range"); } // 如果需要扩容 if (size == capacity) { resize(capacity * 2); } for (int i = size; i >= index; i--) { data[i] = data[i - 1]; } data[index] = value; size++; } void SeqList::remove(int index) { if (index < 0 || index >= size) { throw std::out_of_range("Index out of range"); } for (int i = index; i < size - 1; i++) { data[i] = data[i + 1]; } delete[] data[size]; // 释放最后一个元素的空间 size--; } ``` 4. **查找和访问元素**: - `find(int index)` 查找指定索引的元素,`get(int index)` 返回对应索引的元素。 ```cpp T& SeqList::get(int index) const { if (index < 0 || index >= size) { throw std::out_of_range("Index out of range"); } return data[index]; } // ... 实现 find 方法类似 get ``` 5. **整体建表算法**: - 可能会有从已有数据源创建序列表的函数,如从文件读取或数组复制等。 6. **其他辅助功能**: - `resize(int newCapacity)` 扩容序列, - `clear()` 清空序列,释放内存, - `isFull()` 检查是否已满等。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金州饿霸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值