C语言实现顺序表的基本操作指南(注释很详细)

目录
  • 创建一个结构体用于存放顺序表相关数据
  • 初始化顺序表
  • 插入元素
    • 先检查容量是否够用
  • 删除元素
  • 元素修改
  • 查找元素
  • 排序元素
  • 元素反转
  • 源码
    • SeqList.c
    • test.c
    • SeqList.h
  • 总结

创建一个结构体用于存放顺序表相关数据

#define SEQTYPE int
typedef struct SeqList
{
	SEQTYPE* data;
	int size;		//有效数据个数
	int capacity;	//容量
}SeqList;

初始化顺序表

void SeqListInit(SeqList* pq)
{
	CheckNull(pq);

	pq->data = NULL;
	pq->capacity = 0;
	pq->size = 0;
}

插入元素

  1. 插入到表头;
  2. 插入到指定位置;
  3. 插入到尾部;

先检查容量是否够用

void CheckCapacity(SeqList* pq)
{
	CheckNull(pq);

	//如果空间满了,扩容
	if (pq->size >= pq->capacity)
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;

		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);
		if (new == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		pq->data = new;
		pq->capacity = newcapacity;

	}
	puts("增容成功");
}

//往顺序表指定位置插入数据
void SeqListInsert(SeqList* pq, int pos)
{
	CheckNull(pq);
	assert(pos <= pq->size);
	SEQTYPE InsertVal;
	if (pos == -1)
	{
		printf("请分别输入添加的数据和位置,空格隔开:>");
		scanf("%d %d", &InsertVal, &pos);
		if (pos > pq->size)
		{
			printf("请正确输入\n");
			return;
		}
	}
	else
	{
		printf("请输入添加的数据:>");
		scanf("%d", &InsertVal);
	}
	//检查容量是否足够
	CheckCapacity(pq);

	//插入数据
	int end = pq->size;
	int begin = pos;

	while (begin < end)
	{
		pq->data[end] = pq->data[end - 1];
		--end;
	}
	pq->data[pos] = InsertVal;
	++pq->size;
	printf("添加成功\n");
}

//往顺序表末位置插入数据
void SeqListPushBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, pq->size);
}

//往顺序表首位置插入数据
void SeqListPushFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, 0);
}

删除元素

  1. 删除首元素;
  2. 删除指定位置元素;
  3. 删除尾部元素;
//从顺序表指定位置删除数据
void SeqListErase(SeqList* pq, int pos)
{
	CheckNull(pq);

	if (pos == -1)
	{
		printf("请输入要删除数据的位置:>");
		scanf("%d", &pos);
		if (pos < 0 || pos >= pq->size)
		{
			printf("请正确输入\n");
			return;
		}
	}

	int begin = pos;
	int end = pq->size - 1;
	while (begin < end)
	{
		pq->data[begin] = pq->data[begin + 1];
		++begin;
	}

	--pq->size;
	puts("删除成功");
}

//从顺序表末位置删除数据
void SeqListPophBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, pq->size - 1);
}

//从顺序表首位置删除数据
void SeqListPophFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, 0);
}

元素修改

  1. 找到目标元素;
  2. 直接修改该元素的值;
//修改顺序表指定位置数据
void SeqListModify(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	SEQTYPE x;
	printf("请输入修改的位置和新的数据,空格隔开:>");
	scanf("%d %d", &pos, &x);
	if (pos < 0 && pos >= pq->size)
	{
		printf("请正确输入\n");
		return;
	}

	pq->data[pos] = x;
	puts("修改成功");
}

查找元素

查找目标元素,算法多种,比如二分,插值等等,这里使用顺序查找算法,具体代码如下:

//查找所需数据是否存在顺序表中
void SeqListFindData(SeqList* pq)
{
	CheckNull(pq);
	SEQTYPE x;

	printf("请输入要查找的数据:>");
	scanf("%d", &x);

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == x)
		{
			printf("所需查询数据存在,下标为:>%d\n", i);
			return;
		}
	}
	printf("找不到\n");

}

排序元素

//排序顺序表
void SeqListSort(SeqList* pq)
{
	CheckNull(pq);

	int option = 0;
	printf("输入0为升序,1为降序:>");
	scanf("%d", &option);

	for (int i = 0; i < pq->size - 1; i++)
	{
		for (int j = 0; j < pq->size - i - 1; j++)
		{
			if (pq->data[j] > pq->data[j + 1])
			{
				SEQTYPE tmp = pq->data[j];
				pq->data[j] = pq->data[j + 1];
				pq->data[j + 1] = tmp;
			}
		}
	}

	if (option)
	{
		SeqListReverse(pq);
		return;
	}

}

元素反转

//顺序表反转
void SeqListReverse(SeqList* pq)
{
	CheckNull(pq);

	int left = 0;
	int right = pq->size - 1;

	while (left < right)
	{
		SEQTYPE tmp = pq->data[left];
		pq->data[left] = pq->data[right];
		pq->data[right] = tmp;
		++left;
		--right;
	}

}

源码

  • 以上是顺序表常用的功能操作,下面附上完整代码,VS2019环境

SeqList.c

#include "SeqList.h"

void CheckNull(SeqList* pq)
{
	if (pq == NULL)
	{
		perror("pq::");
		exit(-1);
	}
}

//初始化顺序表
void SeqListInit(SeqList* pq)
{
	CheckNull(pq);

	pq->data = NULL;
	pq->capacity = 0;
	pq->size = 0;
}

void SeqListDestory(SeqList* pq)
{
	CheckNull(pq);

	free(pq->data);
	pq->data = NULL;

	pq->size = 0;
	pq->capacity = 0;

}

void CheckCapacity(SeqList* pq)
{
	CheckNull(pq);

	//如果空间满了,扩容
	if (pq->size >= pq->capacity)
	{
		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;

		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);
		if (new == NULL)
		{
			perror("realloc");
			exit(-1);
		}

		pq->data = new;
		pq->capacity = newcapacity;

	}
	puts("增容成功");
}

void SeqListPrint(SeqList* pq)
{
	CheckNull(pq);
	if (pq->size == 0)
		printf("\n");
	else
	{
		for (int i = 0; i < pq->size; i++)
		{
			printf("%d ", pq->data[i]);
		}
		puts("\n--------------------------------------");
	}

}

//往顺序表末位置插入数据
void SeqListPushBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, pq->size);
}

//往顺序表首位置插入数据
void SeqListPushFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListInsert(pq, 0);
}

//往顺序表指定位置插入数据
void SeqListInsert(SeqList* pq, int pos)
{
	CheckNull(pq);
	assert(pos <= pq->size);
	SEQTYPE InsertVal;
	if (pos == -1)
	{
		printf("请分别输入添加的数据和位置,空格隔开:>");
		scanf("%d %d", &InsertVal, &pos);
		if (pos > pq->size)
		{
			printf("请正确输入\n");
			return;
		}
	}
	else
	{
		printf("请输入添加的数据:>");
		scanf("%d", &InsertVal);
	}
	//检查容量是否足够
	CheckCapacity(pq);

	//插入数据
	int end = pq->size;
	int begin = pos;

	while (begin < end)
	{
		pq->data[end] = pq->data[end - 1];
		--end;
	}
	pq->data[pos] = InsertVal;
	++pq->size;
	printf("添加成功\n");

}

//从顺序表指定位置删除数据
void SeqListErase(SeqList* pq, int pos)
{
	CheckNull(pq);

	if (pos == -1)
	{
		printf("请输入要删除数据的位置:>");
		scanf("%d", &pos);
		if (pos < 0 || pos >= pq->size)
		{
			printf("请正确输入\n");
			return;
		}
	}

	int begin = pos;
	int end = pq->size - 1;
	while (begin < end)
	{
		pq->data[begin] = pq->data[begin + 1];
		++begin;
	}

	--pq->size;
	puts("删除成功");

}

//从顺序表末位置删除数据
void SeqListPophBack(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, pq->size - 1);
}

//从顺序表首位置删除数据
void SeqListPophFront(SeqList* pq)
{
	CheckNull(pq);
	SeqListErase(pq, 0);
}

//修改顺序表指定位置数据
void SeqListModify(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	SEQTYPE x;
	printf("请输入修改的位置和新的数据,空格隔开:>");
	scanf("%d %d", &pos, &x);
	if (pos < 0 && pos >= pq->size)
	{
		printf("请正确输入\n");
		return;
	}

	pq->data[pos] = x;
	puts("修改成功");
}

//查找顺序表指定位置数据
void SeqListFindPos(SeqList* pq)
{
	CheckNull(pq);
	int pos;
	printf("请输入要查找数据的位置:>");
	scanf("%d", &pos);
	if (pos < 0 && pos >= pq->size)
	{
		printf("请正确输入\n");
		return;
	}

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == pq->data[pos])
		{
			printf("查找位置的数据为:>%d\n", pq->data[pos]);
			break;
		}
	}

}

//查找所需数据是否存在顺序表中
void SeqListFindData(SeqList* pq)
{
	CheckNull(pq);
	SEQTYPE x;

	printf("请输入要查找的数据:>");
	scanf("%d", &x);

	for (int i = 0; i < pq->size; i++)
	{
		if (pq->data[i] == x)
		{
			printf("所需查询数据存在,下标为:>%d\n", i);
			return;
		}
	}
	printf("找不到\n");

}

//排序顺序表
void SeqListSort(SeqList* pq)
{
	CheckNull(pq);

	int option = 0;
	printf("输入0为升序,1为降序:>");
	scanf("%d", &option);

	for (int i = 0; i < pq->size - 1; i++)
	{
		for (int j = 0; j < pq->size - i - 1; j++)
		{
			if (pq->data[j] > pq->data[j + 1])
			{
				SEQTYPE tmp = pq->data[j];
				pq->data[j] = pq->data[j + 1];
				pq->data[j + 1] = tmp;
			}
		}
	}

	if (option)
	{
		SeqListReverse(pq);
		return;
	}

}

//顺序表反转
void SeqListReverse(SeqList* pq)
{
	CheckNull(pq);

	int left = 0;
	int right = pq->size - 1;

	while (left < right)
	{
		SEQTYPE tmp = pq->data[left];
		pq->data[left] = pq->data[right];
		pq->data[right] = tmp;
		++left;
		--right;
	}

}

test.c

#include "SeqList.h"

void menu()
{
	printf("######################################################\n");
	printf("#####       1.  Print        2.  Insert          #####\n");
	printf("#####       3.  PushFront    4.  PushBack        #####\n");
	printf("#####       5.  PopFront     6.  PopBack         #####\n");
	printf("#####       7.  FindPos      8.  FindData        #####\n");
	printf("#####       9.  Modify       10. Erase           #####\n");
	printf("#####       11. EMPTY        12. Sort            #####\n");
	printf("#####       13. Reverse      0.  Exit            #####\n");
	printf("######################################################\n");
}

enum Option
{
	EXIT,
	PRINT,
	INSERT,
	PUSHFRONT,
	PUSHBACK,
	POPFRONT,
	POPBACK,
	FINDPOS,
	FINDDATA,
	MODIFY,
	ERASE,
	EMPTY,
	SORT,
	REVERSE,
};

int main()
{
	int option = 0;
	int posi = -1;

	SeqList s;

	SeqListInit(&s);

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &option);
		switch (option)
		{
		case PRINT:
			SeqListPrint(&s);
			break;

		case INSERT:
			SeqListInsert(&s, posi);
			break;

		case PUSHFRONT:
			SeqListPushFront(&s);
			break;

		case PUSHBACK:
			SeqListPushBack(&s);
			break;

		case POPFRONT:
			SeqListPophFront(&s);
			break;

		case POPBACK:
			SeqListPophBack(&s);
			break;

		case FINDPOS:
			SeqListFindPos(&s);
			break;

		case FINDDATA:
			SeqListFindData(&s);
			break;
		case MODIFY:
			SeqListModify(&s);
			break;

		case ERASE:
			SeqListErase(&s, posi);
			break;

		case EMPTY:
			SeqListDestory(&s);
			break;

		case SORT:
			SeqListSort(&s);
			break;

		case REVERSE:
			SeqListReverse(&s);
			break;

		case EXIT:
			SeqListDestory(&s);
			printf("退出\n");
			break;

		default:
			printf("请正确输入\n");
			break;
		}
	} while (option);

	return 0;
}

SeqList.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
#include <string.h>

//

#define SEQTYPE int
typedef struct SeqList
{
	SEQTYPE* data;
	int size;		//有效数据个数
	int capacity;	//容量
}SeqList;

//初始化顺序表
void SeqListInit(SeqList* pq);

//销毁顺序表
void SeqListDestory(SeqList* pq);

//打印顺序表
void SeqListPrint(SeqList* pq);

//往顺序表指定位置插入数据
void SeqListInsert(SeqList* pq, int pos);

//往顺序表末位置插入数据
void SeqListPushBack(SeqList* pq);

//往顺序表首位置插入数据
void SeqListPushFront(SeqList* pq);

//从顺序表指定位置删除数据
void SeqListErase(SeqList* pq, int pos);

//从顺序表末位置删除数据
void SeqListPophBack(SeqList* pq);

//从顺序表首位置删除数据
void SeqListPophFront(SeqList* pq);

//修改顺序表指定位置数据
void SeqListModify(SeqList* pq);

//查找顺序表指定位置数据
void SeqListFindPos(SeqList* pq);

//查找所需数据是否存在顺序表中
void SeqListFindData(SeqList* pq);

//排序顺序表
void SeqListSort(SeqList* pq);

//顺序表反转
void SeqListReverse(SeqList* pq);

总结

到此这篇关于C语言实现顺序表的基本操作指南的文章就介绍到这了,更多相关C语言实现顺序表基本操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 利用C语言实现顺序表的实例操作

    本文实例讲述了C语言实现顺序表(线性表)的方法.分享给大家供大家参考,具体如下: 一:顺序表代码实现 #ifndef _SEQ_LIST_H #define _SEQ_LIST_H #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define ElemType float //以float类型测试算法通用性,而不是以惯用的int #define I

  • C语言实现顺序表基本操作汇总

    本文汇总了C语言下实现及操作顺序表的方法,对于学习数据结构的朋友来说是一个不错的参考程序.完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int status ;

  • c语言实现顺序表的基本操作

    数据结构顺序表操作 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100#define LISINCREMENT 10#define ElemType int#define Status inttypedef struct Sq{ ElemType *elem; int length; int listsize;}SqList;Statu

  • C语言实现顺序表的基本操作指南(注释很详细)

    目录 创建一个结构体用于存放顺序表相关数据 初始化顺序表 插入元素 先检查容量是否够用 删除元素 元素修改 查找元素 排序元素 元素反转 源码 SeqList.c test.c SeqList.h 总结 创建一个结构体用于存放顺序表相关数据 #define SEQTYPE int typedef struct SeqList { SEQTYPE* data; int size; //有效数据个数 int capacity; //容量 }SeqList; 初始化顺序表 void SeqListIn

  • C语言实现顺序表的顺序查找和折半查找

    本文实例为大家分享了C语言实现顺序表的顺序查找和折半查找的具体代码,供大家参考,具体内容如下 顺序查找: #include <iostream> using namespace std; int SeqSearch(int r[],int n,int k) { r[0]=k;//下标0用作哨兵存放要查询的数 int i=n; while(r[i]!=k)//不用判断下标i是否越界 { i--; } return i; } int main() { int n; cout<<&quo

  • C语言动态顺序表实例代码

    目录 顺序表概念: 一.准备工作 二.顺序表的基本操作  1.顺序表的初始化函数 2.尾插函数(在尾部插入数据) 3.头插函数(在数组头部插入数据)  4.尾删函数 5.头删函数 6.在第pos的位置插入数据 7.删除第pos个位置的数据 8.修改第pos个位置的数据 9.查找函数. 10.销毁函数 11.打印函数 三.总代码: 顺序表概念:         顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构.一般情况下用数组存储.在数组上完成数据的增删查改. 代码解析: 一.准备工

  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    目录 初始化 尾插 格局打开 尾删 初始化 在初步认识顺序表这一结构后,我们就可以继续深入探究这是我之前在.h文件中创建的结构体 typedef int type; typedef struct list { type* a; int size; int capacity; }st; 在处理顺序表结构时我们会用到的一些接口,处理其中的关系,其实本质上就是函数,这里我用复杂英文对应出来方便形成记忆. void init(st *s); //插入 void pushback( st* p, type

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • C语言经典顺序表真题演练讲解

    目录 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 1.移除元素 链接直达: https://leetcode-cn.com/problems/remove-element/ 题目: 思路: 法一:依次挪动数据进行覆盖 从第一个数据开始进行依次遍历,如同示例1,依次遍历数组,找到移除的元素2就把后面的数据往前挪动进行覆盖,如图所示: 此法有个缺陷,题目中明确指出使用空间复杂度O(1)的方法解决此问题,而此法的空间复杂度刚好为O(1),可以解决,不过考虑周全些,时间复杂度在情况最

  • C语言数据结构顺序表的进阶讲解

    目录 前言 一.顺序表的构造VS功能 1.顺序表的构造 2.接口实现(功能) 二.功能具体分析 1.初始化 2.销毁 3.检查size与capacity是否溢出 4.尾增功能(实现) 5.打印 三.实现具体功能代码页(SeqList.c) 四.总结 前言 在学习链表之前先掌握顺序表 什么是顺序表? 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储,在数组上完成数据的增删查改. 顺序表一般可分为: 1.静态顺序表:使用定长数组存储. 2.动态顺序表:使用动态开辟

  • C语言实现顺序表的全操作详解

    目录 线性表 顺序表 顺序表接口实现 1.顺序表初始化 2.顺序表空间增容 3.顺序表打印 4.尾插数据 5.尾删数据 6.头插数据 7.头删数据 8.在pos下标处插入数据 9.删除pos下标处数据 10.数据查找 11.顺序表摧毁 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表.链表.栈.队列.字符串等. 线性表在逻辑上是线性结构,也就是连续的一条直线.但在物理结构上并不一定是连续的,线性表在物理

  • C语言实现顺序表的基本操作的示例详解

    目录 一.认识顺序表 1.线性表 2.顺序表的概念及结构 二.顺序表的基本操作(接口实现) 1.初始化顺序表 2.打印顺序表 3.尾插 4.尾删 5.扩容 6.头插 7.头删 8.任意位置插入 9.任意位置删除 10.查找某个数的位置 三.顺序表演示及代码(含源码) 1.演示效果 2.完整源代码 一.认识顺序表 1.线性表 线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表有顺序表.链表.栈.队列.字符串……线性表在逻辑上是线性结构,也就是说是一条

随机推荐