顺序表的增删改查

代码功能

//SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>

#define SeqListMaxArr 1000
typedef char SeqListType;

typedef struct SeqList
{
	SeqListType SeqListArr[SeqListMaxArr];
	size_t size;
}SeqList;

void SeqListInit(SeqList *seq);//初始化顺序表
void SeqListPrint(SeqList *seq, char *ch);//打印顺序表
void SeqListPushEnd(SeqList *seq, SeqListType value);//尾部增加一个元素value
void SeqListPopEnd(SeqList *seq);//尾部删除一个元素
void SeqListPushFirst(SeqList *seq, SeqListType value);//头部增加一个元素value
void SeqListPopFirst(SeqList *seq);//头删一个元素
void SeqListPushMiddle(SeqList *seq, size_t pos,SeqListType value);//在位置[pos]插入一元素value
void SeqListPopMiddle(SeqList *seq, size_t pos);//删除下标为[pos]的元素
void SeqListSet(SeqList *seq, size_t pos, SeqListType value);//将下标为[pos]的元素改为value
SeqListType SeqListGetValue(SeqList *seq, size_t pos);//查询下标为[pos]的元素
size_t SeqListGetPos(SeqList *seq, SeqListType value);//查询value元素所在的下标


///
//新增功能
//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个
int SeqListRemove(SeqList* seq, SeqListType to_delete);

//删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本
void SeqListRemoveAll(SeqList* seq, SeqListType to_delete);

//获取顺序表元素个数
size_t SeqListSize(SeqList* seq);

//判定顺序表是否为空
int SeqListEmpty(SeqList* seq);

//冒泡排序
void SeqListBubbleSort(SeqList* seq);

//冒泡排序升级版
void SeqListBubbleSortEx(SeqList* seq, int(*cmp)(SeqListType, SeqListType));
//利用回调函数对顺序表排序进行简化
int cmp(SeqListType a, SeqListType b);


//SeqList.c
#include "SeqList.h"
#include <assert.h>


//初始化数组
void SeqListInit(SeqList *seq)
{
	assert(seq);
	seq->size = 0;
}

//打印顺序表
void SeqListPrint(SeqList *seq,char *ch)
{
	size_t i = 0;
	printf("%s\n", ch);
	for (i = 0; i < seq->size; i++)
	{
		printf("下标为%d个元素是 : [  %c  ]  地址是 : [  %p  ]\n", i, seq->SeqListArr[i], &(seq->SeqListArr[i]));
	}
	printf("size = %ld\n", seq->size);
}


//尾部增加一个元素value
void SeqListPushEnd(SeqList *seq, SeqListType value)
{
	assert(seq);
	if (seq->size >= SeqListMaxArr){
		printf("当前顺序表满\n");
		return;
	}
	seq->SeqListArr[seq->size] = value;
	seq->size++;
}

//尾部删除一个元素
void SeqListPopEnd(SeqList *seq)
{
	assert(seq);
	if (seq->size == 0){
		printf("当前为空表\n");
		return;
	}
	seq->size--;
}

//头部增加一个元素value
void SeqListPushFirst(SeqList *seq, SeqListType value)
{
	assert(seq);
	if (seq->size >= SeqListMaxArr){
		printf("当前顺序表满\n");
		return;
	}
	int i = 0;
	for (i = seq->size - 1; i >= 0; i--)
	{
		seq->SeqListArr[i + 1] = seq->SeqListArr[i];
	}
	seq->SeqListArr[0] = value;
	seq->size++;
}

//头删一个元素
void SeqListPopFirst(SeqList *seq)
{
	assert(seq);
	if (seq->size == 0){
		printf("当前为空表\n");
		return;
	}
	size_t i = 0;
	for (i = 0; i < seq->size - 1; i++)
	{
		seq->SeqListArr[i] = seq->SeqListArr[i + 1];
	}
	seq->size--;
}

//在位置[pos]插入一元素value
void SeqListPushMiddle(SeqList *seq, size_t pos, SeqListType value)
{
	assert(seq);
	if (pos < 0 || pos >= seq->size){
		printf("输入位置不合法\n");
		return;
	}
	size_t i = 0;
	for (i = seq->size - 1; i >= pos; i--)
	{
		seq->SeqListArr[i + 1] = seq->SeqListArr[i];
	}
	seq->SeqListArr[pos] = value;
	seq->size++;
}

//删除下标为[pos]的元素
void SeqListPopMiddle(SeqList *seq, size_t pos)
{
	assert(seq);
	if (pos < 0 || pos >= seq->size){
		printf("当前位置不合法\n");
		return;
	}
	size_t i = 0;
	for (i = pos; i < seq->size - 1; i++)
	{
		seq->SeqListArr[i] = seq->SeqListArr[i + 1];
	}
	seq->size--;
}

//将下标为[pos]的元素改为value
void SeqListSet(SeqList *seq, size_t pos, SeqListType value)
{
	assert(seq);
	if (pos < 0 || pos >= seq->size){
		printf("当前位置不合法\n");
		return;
	}
	seq->SeqListArr[pos] = value;
}

//查询下标为[pos]的元素
SeqListType SeqListGetValue(SeqList *seq, size_t pos)
{
	assert(seq);
	if (pos < 0 || pos >= seq->size){
		printf("当前位置不合法\n");
		return (SeqListType)0;
	}
	return seq->SeqListArr[pos];
}

//查询value元素所在的下标
size_t SeqListGetPos(SeqList *seq, SeqListType value)
{
	assert(seq);
	size_t i = 0;
	for (i = 0; i < seq->size; i++)
	{
		if (seq->SeqListArr[i] == value)
			return i;
	}
	return -1;
}

/
//新增功能代码
//删除顺序表中指定的值, 如果存在重复元素, 只删除第一个
int SeqListRemove(SeqList* seq, SeqListType to_delete)
{
	assert(seq);
	size_t i = 0;
	for (; i < seq->size; i++)
	{
		if (seq->SeqListArr[i] == to_delete)
			break;
	}
	if (i < seq->size)
	{
		for (size_t j = i; j < seq->size - 1; j++)
		{
			seq->SeqListArr[j] = seq->SeqListArr[j + 1];
		}
		seq->size--;
	}
	else
	{
		printf("列表中没有所要删除的值\n");
		return -1;
	}
		return i;
}

//删除顺序表中所有的指定的值, 另外要实现一个时间复杂度为 O(N) 的优化版本
void SeqListRemoveAll(SeqList* seq, SeqListType to_delete)
{
	assert(seq);
	size_t i = SeqListRemove(seq, to_delete);
	while (i < seq->size)
		i = SeqListRemove(seq, to_delete);
}

//获取顺序表元素个数
size_t SeqListSize(SeqList* seq)
{
	assert(seq);
	return seq->size;
}

//判定顺序表是否为空
int SeqListEmpty(SeqList* seq)
{
	assert(seq);
	if (seq->size == 0)
		return 0;
	return 1;
}


//冒泡排序
void SeqListBubbleSort(SeqList* seq)
{
	assert(seq);
	size_t i = 0;
	size_t j = 0;
	for (i = 0; i < seq->size - 1; i++)
	{
		for (j = 0; j < seq->size - i - 1; j++)
		{
			if (seq->SeqListArr[j] > seq->SeqListArr[j + 1])
			{
				SeqListType tmp = seq->SeqListArr[j];
				seq->SeqListArr[j] = seq->SeqListArr[j + 1];
				seq->SeqListArr[j + 1] = tmp;
			}
		}
	}
}

//利用回调函数对顺序表进行排序,只用改变cmp函数的if()条件,就可以改变排序方法
//以下采用由大到小排序
int cmp(SeqListType a, SeqListType b)
{
	if (a < b)
		return 1;
	return 0;
}

//冒泡排序升级版
void SeqListBubbleSortEx(SeqList* seq, int(*cmp)(SeqListType, SeqListType))
{
	assert(seq);
	size_t i = 0;
	size_t j = 0;
	for (i = 0; i < seq->size - 1; i++)
	{
		for (j = 0; j < seq->size - i - 1; j++)
		{
			if (cmp(seq->SeqListArr[j], seq->SeqListArr[j + 1])>0)
			{
				SeqListType tmp = seq->SeqListArr[j];
				seq->SeqListArr[j] = seq->SeqListArr[j + 1];
				seq->SeqListArr[j + 1] = tmp;
			}
		}
	}
}

//test.c
#include "SeqList.h"
#include <assert.h>
#include <stdio.h>

void TestSeqListInit()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPrint(&seqlist, "【测试初始化顺序表】");
}
void TestSeqListPushEnd()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPrint(&seqlist, "【测试尾增5元素】");
}

void TestSeqListPopEnd()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPopEnd(&seqlist);
	SeqListPopEnd(&seqlist);
	SeqListPrint(&seqlist, "【测试尾删2元素】");

	printf("\n【测试尾删特殊情况(表空)】\n");
	SeqListInit(&seqlist);
	SeqListPopEnd(&seqlist);
}

void TestSeqListPushFirst()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPushFirst(&seqlist, 'z');
	SeqListPrint(&seqlist, "【测试头增1元素】");
}

void TestSeqListPopFirst()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPopFirst(&seqlist);
	SeqListPrint(&seqlist, "【测试头删1元素】");

	printf("\n【测试头删特殊情况(表空)】\n");
	SeqListInit(&seqlist);
	SeqListPopFirst(&seqlist);
}

void TestSeqListPushMiddle()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPushMiddle(&seqlist, 2, 'X');
	SeqListPrint(&seqlist, "【测试在下标[2]处插入‘X’】");

	printf("\n【测试插入特殊情况(pos不在[0~size-1]之间)】\n");
	SeqListPushMiddle(&seqlist, 100, 'Y');
}

void TestSeqListPopMiddle()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPopMiddle(&seqlist, 2);
	SeqListPrint(&seqlist, "【测试删除原本下标为[2]的元素‘c’】");

	printf("\n【测试删除特殊情况(pos不在[0~size-1]之间)】\n");
	SeqListPopMiddle(&seqlist, 100);
}

void TestSeqListSet()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListSet(&seqlist, 2, 'X');
	SeqListPrint(&seqlist, "【测试原本下标为[2]的元素改为‘X’】");

	printf("\n【测试修改元素特殊情况(pos不在[0~size-1]之间)】\n");
	SeqListSet(&seqlist, 100, 'X');
}

void TestSeqListGetValue()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPrint(&seqlist, "【查询下标为[2]的元素】");
	char ch = SeqListGetValue(&seqlist, 2);
	printf("下标为2的元素是 %c\n", ch);

	printf("\n【测试查询元素特殊情况(pos不在[0~size-1]之间)】\n");
	SeqListGetValue(&seqlist, 100);
}

void TestSeqListGetPos()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPrint(&seqlist, "【查询'c'的下标】");
	size_t pos = SeqListGetPos(&seqlist, 'c');
	printf("c的下标为 %ld\n", pos);

	printf("\n【测试查询下标特殊情况(找不到value)】\n");
	size_t poserror = SeqListGetPos(&seqlist, 'A');
	printf("c的下标为 %lu\n", poserror); //结果为一个很大的数即找不到
}

void TestSeqListRemove()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListRemove(&seqlist, 'c');
	SeqListPrint(&seqlist, "【删除存在元素'c'】");
	SeqListRemove(&seqlist, 'z');
	SeqListPrint(&seqlist, "【删除不存在元素'z'】");

}

void TestSeqListRemoveAll()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'e');
	SeqListRemoveAll(&seqlist, 'c');
	SeqListPrint(&seqlist, "【删除多次存在元素的'c'】");
}

void TestSeqListSize()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListRemove(&seqlist, 'c');
	size_t i = SeqListSize(&seqlist);
	printf("顺序表元素个数为%d\n", i);
}

void TestSeqListEmpty()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPrint(&seqlist, "【顺序表空时】");
	int i = SeqListEmpty(&seqlist);
	if (i == 0)
		printf("SeqList NULL\n");
	else
		printf("SeqList NOT NULL\n");
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPrint(&seqlist, "【顺序表非空时】");
	i = SeqListEmpty(&seqlist);
	if (i == 0)
		printf("SeqList NULL\n");
	else
		printf("SeqList NOT NULL\n");
}

void TestSeqListBubbleSort()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPrint(&seqlist, "【排序前】");
	SeqListBubbleSort(&seqlist);
	SeqListPrint(&seqlist, "【排序后】");

}

void TsetSeqListBubbleSortEx()
{
	SeqList seqlist;
	SeqListInit(&seqlist);
	SeqListPushEnd(&seqlist, 'a');
	SeqListPushEnd(&seqlist, 'e');
	SeqListPushEnd(&seqlist, 'd');
	SeqListPushEnd(&seqlist, 'b');
	SeqListPushEnd(&seqlist, 'c');
	SeqListPrint(&seqlist, "【升级排序前】");
	SeqListBubbleSortEx(&seqlist, cmp);
	SeqListPrint(&seqlist, "【升级排序后】");
}
int main()
{
	TestSeqListInit();
	TestSeqListPushEnd();
	TestSeqListPopEnd();
	TestSeqListPushFirst();
	TestSeqListPopFirst();
	TestSeqListPushMiddle();
	TestSeqListPopMiddle();
	TestSeqListSet();
	TestSeqListGetValue();
	TestSeqListGetPos();
	TestSeqListRemove();
	TestSeqListRemoveAll();
	TestSeqListSize();
	TestSeqListEmpty();
	TestSeqListBubbleSort();
	TsetSeqListBubbleSortEx();
	system("pause");
	return 0;
}



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的在 C# Winform 窗体中实现顺序表增删改查的实例: 1. 首先,在你的 Winform 窗体中添加四个 TextBox 控件和四个 Button 控件,分别用于输入元素、输入要删除的元素位置、输入要修改的元素位置和输入新值,以及按钮事件。 2. 接下来,在窗体的 Load 事件中,声明一个 List<int> 类型的变量来存储顺序表中的元素: ``` List<int> array = new List<int>(); ``` 3. 实现插入元素的方法。在 button1_Click 事件中,通过 TextBox 控件获取要插入的元素值,并调用 List 类型的 Add 方法将元素插入到顺序表中: ``` private void button1_Click(object sender, EventArgs e) { int value = int.Parse(textBox1.Text); array.Add(value); // 更新 DataGridView 控件中的数据 dataGridView1.DataSource = null; dataGridView1.DataSource = array; } ``` 4. 实现删除元素的方法。在 button2_Click 事件中,通过 TextBox 控件获取要删除的元素位置,然后调用 List 类型的 RemoveAt 方法删除指定位置的元素: ``` private void button2_Click(object sender, EventArgs e) { int index = int.Parse(textBox2.Text); array.RemoveAt(index); // 更新 DataGridView 控件中的数据 dataGridView1.DataSource = null; dataGridView1.DataSource = array; } ``` 5. 实现修改元素的方法。在 button3_Click 事件中,通过 TextBox 控件获取要修改的元素位置和新值,然后调用 List 类型的 indexer 语法修改指定位置的元素: ``` private void button3_Click(object sender, EventArgs e) { int index = int.Parse(textBox3.Text); int value = int.Parse(textBox4.Text); array[index] = value; // 更新 DataGridView 控件中的数据 dataGridView1.DataSource = null; dataGridView1.DataSource = array; } ``` 6. 实现查找元素的方法。在 button4_Click 事件中,通过 TextBox 控件获取要查找的元素值,然后调用 List 类型的 FindIndex 方法查找元素的位置: ``` private void button4_Click(object sender, EventArgs e) { int value = int.Parse(textBox5.Text); int index = array.FindIndex(x => x == value); if(index >= 0) { MessageBox.Show($"元素 {value} 的位置是:{index}"); } else { MessageBox.Show($"元素 {value} 不存在!"); } } ``` 以上就是一个简单的在 C# Winform 窗体中实现顺序表增删改查的实例。你可以将这些方法放在一个类中,并在 Winform 中调用这个类来操作顺序表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值