2022-02-09_顺序表

一、

作业标题

顺序表的增删查改

第一步、创建三个程序文件

 

第二步、实现程序

test.c部分

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
#include "SeqList.h"


enum option
{
	退出,
	尾插数据,
	头插数据,
	尾删数据,
	头删数据,
	打印数据,
	查找数据,
	随机插值,
	清除数据,
}Option;

void menu()
{
	printf("**************************************\n");
	printf("*****   1.尾插数据  2.头插数据   *****\n");
	printf("*****   3.尾删数据  4.头删数据   *****\n");
	printf("*****   5.打印数据  6.查找数据   *****\n");
	printf("*****   7.随机插值  8.清除数据   *****\n");
	printf("*****   0.退出                   *****\n");
	printf("**************************************\n");
}


int main()
{
	int option = 0;
	SeqList s;
	SeqListInit(&s);
	do
	{
		printf("请输入你要进行的操作:\n");
		menu();
		scanf("%d", &option);
		switch (option)
		{
		case 尾插数据:
			printf("请输入尾插的数值:\n");
			int tmp1 = 0;
			scanf("%d", &tmp1);
			SeqListPushBack(&s, tmp1);
			SeqListPrint(&s);
			break;
		case 头插数据:
			printf("请输入头插的数值:\n");
			int tmp2 = 0;
			scanf("%d", &tmp2);
			SeqListPushFront(&s, tmp2);
			SeqListPrint(&s);
			break;
		case 尾删数据:
			SeqListPopBack(&s);
			SeqListPrint(&s);
			break;
		case 头删数据:
			SeqListPopFront(&s);
			SeqListPrint(&s);
			break;
		case 打印数据:
			SeqListPrint(&s);
			break;
		case 查找数据:
			printf("请输入要查找第几位上的数值(位数从第一位开始):\n");
			int tmp3 = 0;
			scanf("%d", &tmp3);
			SeqListFind(&s, 2);
			break;
		case 随机插值:
			printf("请输入要在第几位上插入何数值(位数从第一位开始):\n");
			int tmp4 = 0;
			int tmp5 = 0;
			scanf("%d %d", &tmp4, &tmp5);
			SeqListInsert(&s, tmp4-1, tmp5);
			SeqListPrint(&s);
			break;
		case 清除数据:
			printf("请输入要清除第几位上的数值(位数从第一位开始):\n");
			int tmp6 = 0;
			scanf("%d", &tmp6);
			SeqListErase(&s, tmp6 - 1);
			SeqListPrint(&s);
			break;
		case 退出:
			printf("退出顺序表\n");
			SeqListDistroy(&s);
			break;
		default:
			printf("输入有误\n");
			break;
		}
	} while (option);
	return 0;
}

SeqList.h部分

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
typedef int SLDataType;



typedef struct SeqList
{
	SLDataType* a;
	size_t size;
	int capacity;
}SeqList;


//1.顺序表初始化函数声明
void SeqListInit(SeqList* psl);


//2.顺序表打印函数声明
void SeqListPrint(SeqList* psl);


//3.顺序表尾插函数声明
void SeqListPushBack(SeqList* psl, SLDataType x);


//4.顺序表尾删函数声明
void SeqListPopBack(SeqList* psl);


//5.顺序表头插函数函数声明
void SeqListPushFront(SeqList* psl, SLDataType x);


//6.顺序表头插函数函数声明
void SeqListPopFront(SeqList* psl);


//7.扩容函数声明
void SeqListCheckCapacity(SeqList* psl);


//8.顺序表中间插入函数声明
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);


//9.顺序表删除某个数字函数声明
void SeqListErase(SeqList* psl, size_t pos);


//10.顺序表查找函数声明
void SeqListFind(SeqList* psl, SLDataType x);



//11.顺序表释放内存函数声明
void SeqListDistroy(SeqList* psl);

SeqList.c部分

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <ctype.h>
#include <assert.h>
#include "SeqList.h"

//1.顺序表初始化函数实现
void SeqListInit(SeqList* psl)
{
	assert(psl);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}



//2.顺序表打印函数实现
void SeqListPrint(SeqList* psl)
{
	assert(psl);
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}



//7.扩容函数声明
void SeqListCheckCapacity(SeqList* psl)
{
	assert(psl);
	if (psl->size == psl->capacity)
	{
		size_t newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SLDataType* tmp = realloc(psl->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			psl->a = tmp;
			psl->capacity = newCapacity;
		}
	}
}



//3.顺序表尾插函数实现
void SeqListPushBack(SeqList* psl, SLDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl);
	psl->a[psl->size] = x;
	psl->size++;
}



//4.顺序表尾删函数实现
void SeqListPopBack(SeqList* psl)
{
	assert(psl);
	if (psl->size > 0)
	{
		psl->size--;
	}
}



//5.顺序表头插函数函数实现
void SeqListPushFront(SeqList* psl, SLDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl);
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		end--;
	}
	psl->a[0] = x;
	psl->size++;
}



//6.顺序表头删函数函数实现
void SeqListPopFront(SeqList* psl)
{
	assert(psl);
	if (psl->size > 0)
	{
		int begin = 1;
		while (begin < psl->size)
		{
			psl->a[begin - 1] = psl->a[begin];
			begin++;
		}
		psl->size--;
	}
}



//8.顺序表中间插入函数声明
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
	//强力检查
	assert(psl);
	assert(pos <= psl->size);
	SeqListCheckCapacity(psl);
	size_t end = psl->size;
	while (end > pos)
	{
		psl->a[end] = psl->a[end - 1];
		end--;
	}
	psl->a[pos] = x;
	psl->size++;
}



//9.顺序表释放内存函数声明
void SeqListErase(SeqList* psl, size_t pos)
{
	assert(psl);
	assert(pos < psl->size);
	/*assert(psl);
	free(psl->a);
	psl->a = NULL;
	psl->capacity = psl->size = 0;*/
	size_t begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		begin++;
	}
	psl->size--;
}



//10.顺序表查找函数实现
void SeqListFind(SeqList* psl, SLDataType x)
{
	assert(psl);
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			printf("%d\n", i);
		}
	}
}



//11.顺序表释放内存函数实现
void SeqListDistroy(SeqList* psl)
{
	assert(psl);
	free(psl->a);
	psl->a = NULL;
	psl->capacity = 0;
	psl->size = 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值