数据结构之C语言实现顺序表(SeqList)无主函数

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#define ElemType int
#define SEQLIST_DEFAULT_SIZE 8
#define SEQLIST_INC_SIZE     5
//定义顺序表结构体
typedef struct SeqList
{
	ElemType *base; //int *base
	size_t    capacity;//顺序表容量
	size_t    len;//顺序表大小(长度)
}SeqList;


void InitSeqList(SeqList *list);//初始化
void ShowSeqList(SeqList *list);//打印
bool push_back(SeqList *list, ElemType x);//尾插
bool push_front(SeqList *list, ElemType x);//头插
size_t Length(SeqList *list);//求长度
bool insert_pos(SeqList *list, int pos, ElemType x);//按位置插入
bool pop_back(SeqList *list);//尾删
bool pop_front(SeqList *list);//头删
bool insert_val(SeqList *list, ElemType x);//按值插入
bool delete_pos(SeqList *list, int pos);//按位置删除
bool delete_val(SeqList *list, ElemType key);//按值删除
int  find_key(SeqList *list, ElemType key);//查找一个值
void reverse_list(SeqList *list);//逆置顺序表
void sort_list(SeqList *list);//排序
void clear_list(SeqList *list);//清除
void destroy_list(SeqList *list);//摧毁


bool IsFull(SeqList *list)//判满
{
	return list->len >= list->capacity;
}
bool IsEmpty(SeqList *list)//判空
{
	return list->len == 0;
}
void Swap(ElemType &a, ElemType &b)//交换值
{
	ElemType tmp = a;
	a = b;
	b = tmp;
}
//异常安全 
bool Inc(SeqList *list)
{
	size_t new_capacity = list->capacity+SEQLIST_INC_SIZE;
	ElemType *new_base = (ElemType*)realloc(list->base, sizeof(ElemType)*new_capacity);
	if(new_base == NULL)
		return false;
	list->capacity = new_capacity;
	list->base = new_base;
	return true;
}


void InitSeqList(SeqList *list)
{
	list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_DEFAULT_SIZE);//先开辟空间
	assert(list->base != NULL);//断言,如果为假则不执行下面语句
	list->capacity = SEQLIST_DEFAULT_SIZE;
	list->len = 0;
}
void ShowSeqList(SeqList *list)
{
	for(int i=0; i<list->len; ++i)
	{
		printf("%d",list->base[i]);
	}
	printf("\n");
}

bool push_back(SeqList *list, ElemType x)
{
	if(list->len>=list->capacity && !Inc(list))
		//if(!Inc(list) && list->len>=list->capacity)
	{
		printf("空间已满,不能插入");
			return false;
	}
	list->base[list->len++] = x;
	//list->len++;

	return true;
}

bool push_front(SeqList *list, ElemType x)
{
	if(list->len >= list->capacity)
	{
		printf("空间已满,不能头部插入\n");
		return false;
	}
	for(int i=list->len; i>0; --i)
	{
		list->base[i] = list->base[i-1];
	}
	list->base[0] = x;
	list->len++;
	return true;
}

size_t Length(SeqList *list)
{
	return list->len;
}

bool insert_pos(SeqList *list, int pos, ElemType x)
{
	if(list->len >= list->capacity)
	{		
		printf("空间已满,不能插入\n");

		return false;
	}
	if(pos<0 || pos>list->len)
	{

		printf("插入的位置非法\n");

		return false;
	}

	for(int i=list->len; i>pos; --i)
	{
		list->base[i] = list->base[i-1];
	}
	list->base[pos] = x;
	list->len++;
	return true;
}
bool pop_back(SeqList *list)
{
	if(list->len == 0)
	{
		printf("顺序表已空,不能删除\n");
		return false;
	}
	list->len--;
	return true;
}

bool pop_front(SeqList *list)
{
	if(list->len == 0)
	{
		printf("顺序表已空,不能删除\n");
		return false;
	}

	for(int i=0; i<list->len-1; ++i)
	{
		list->base[i] = list->base[i+1];
	}
	list->len--;
	return true;
}
bool insert_val(SeqList *list, ElemType x)
{
	if(list->len >= list->capacity)
	{
		printf("空间已满,不能插入\n");
		return false;
	}
	int i,j;
	for(i=0; i<list->len; ++i)
	{
		if(x < list->base[i])
		{
			for(j=list->len; j>i; --j)
			{
				list->base[j] = list->base[j-1];
			}
			break;
		}
	}
	list->base[i] = x;
	list->len++;
	return true;
}

bool delete_pos(SeqList *list, int pos)
{
	if(list->len == 0)
	{
		printf("顺序表已空,不能删除\n");
		return false;
	}
	if(pos<0 || pos>=list->len)
	{
		printf("删除的位置非法,不能删除\n");
		return false;
	}
	for(int i=pos; i<list->len-1; ++i)
	{
		list->base[i] = list->base[i+1];
	}
	list->len--;
	return true;
}

bool delete_val(SeqList *list, ElemType key)
{
	if(list->len == 0)
	{
		printf("顺序表已空,不能删除\n");
		return false;
	}
	int del_pos = find_key(list, key);
	if(del_pos == -1)
	{
		printf("要删除的数据不存在\n");
		return false;
	}
	return delete_pos(list, del_pos);
}

int  find_key(SeqList *list, ElemType key)
{
	for(int i=0; i<list->len; ++i)
	{
		if(key == list->base[i])
			return i;
	}
	return -1;
}

void reverse_list(SeqList *list)
{
	if(list->len > 1)
	{
		int low = 0;
		int high = list->len-1;
		while(low < high)
		{
			Swap(list->base[low], list->base[high]);
			low++;
			high--;
		}
	}
}

void sort_list(SeqList *list)
{
	if(list->len > 1)
	{
		for(int i=0; i<list->len-1; ++i)
		{
			for(int j=0; j<list->len-i-1; ++j)
			{
				if(list->base[j] > list->base[j+1])
				{
					Swap(list->base[j], list->base[j+1]);
				}
			}
		}
	}
}

void clear_list(SeqList *list)
{
	list->len = 0;
}

void destroy_list(SeqList *list)
{
	free(list->base);
	list->base = NULL; // 预防野指针
	list->capacity = list->len = 0;
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序表的插入操作通常包括以下几个步骤: 1. 判断插入位置是否合法,即插入位置的下标是否在顺序表的范围内; 2. 如果插入位置不在顺序表的末尾,则需要将插入位置及其后面的元素依次向后移动一位,为新元素腾出位置; 3. 将新元素插入到顺序表的指定位置。 以下是一个简单的顺序表插入操作的 C 语言实现: ```c #include <stdio.h> #define MAXSIZE 100 // 定义顺序表的最大长度 typedef struct { int data[MAXSIZE]; // 存储元素的数组 int length; // 当前顺序表的长度 } SeqList; // 在顺序表中插入元素 x 到下标为 i 的位置 int insert(SeqList *L, int i, int x) { if (i < 1 || i > L->length+1 || L->length == MAXSIZE) { // 判断插入位置是否合法 return 0; // 插入失败 } for (int j = L->length; j >= i; j--) { // 将插入位置及其后面的元素依次向后移动一位 L->data[j] = L->data[j-1]; } L->data[i-1] = x; // 将新元素插入到顺序表的指定位置 L->length++; // 更新顺序表的长度 return 1; // 插入成功 } int main() { SeqList L = {{1, 3, 5, 7, 9}, 5}; // 初始化一个顺序表 int i = 3, x = 4; // 要在下标为 3 的位置插入元素 4 if (insert(&L, i, x)) { // 插入成功 printf("Insert %d at position %d success!\n", x, i); for (int j = 0; j < L.length; j++) { printf("%d ", L.data[j]); // 输出插入后的顺序表 } printf("\n"); } else { // 插入失败 printf("Insert %d at position %d failed!\n", x, i); } return 0; } ``` 运行结果为: ``` Insert 4 at position 3 success! 1 3 4 5 7 9 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值