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

目录
  • 顺序表概念:
  • 一.准备工作
  • 二、顺序表的基本操作 
    • 1.顺序表的初始化函数
    • 2.尾插函数(在尾部插入数据)
    • 3.头插函数(在数组头部插入数据)
    •  4.尾删函数
    • 5.头删函数
    • 6.在第pos的位置插入数据
    • 7.删除第pos个位置的数据
    • 8.修改第pos个位置的数据
    • 9.查找函数。
    • 10.销毁函数
    • 11.打印函数
  • 三、总代码:

顺序表概念:

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。一般情况下用数组存储。在数组上完成数据的增删查改。

代码解析:

一.准备工作

1. 首先对一些头文件的引用和创建一个结构体,结构体包含一个数组,size表示该数组目前有多少个元素,capacity表示目前数组能存多少个元素。例如:

 

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>

typedef int DataType;
typedef struct SeqList
{
	DataType* a;
	int size;
	int capacity;
}SL;

2.创建一个顺序表

SL sl;

二、顺序表的基本操作 

1.顺序表的初始化函数

         注意这里的参数得是指针,形参是实参的一份临时拷贝,所以得把地址传给函数才能改变值。

void SeqListInit(SL* sl)
{
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

2.尾插函数(在尾部插入数据)

        写尾插函数之前我们得先判断一下数组空间是否够。例如下面的例子。

所以我们要先检查空间是否满了,满了就扩容

将这个判断空间函数命名为  void CheckSpace(SL* sl) (这是动态顺序表区别于静态顺序表最主要的部分) 

void CheckSpace(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		//因为capacity一开始等于0,所以先给capacity一个值
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
		if (tmp == NULL)
		{
			printf("开辟失败\n");
			exit(-1);
		}
		else
		{
			sl->capacity = newcapacity;
			sl->a = tmp;
		}
	}
}

尾插函数:

void SeqListPushBack(SL* sl, DataType x)
{
CheckSpace(sl);
	sl->a[sl->size] = x;
	sl->size++;
}

3.头插函数(在数组头部插入数据)

       

void SeqListPushFront(SL* sl, DataType x)
{
	//因为插入的时候都要检查空间是不是满了,满了就扩容
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= 0; end--)
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[0] = x;
	sl->size++;
}

 挪数据对应着for循环的代码,最后再给数组的第一个位置赋值。别忘了对size+1.

 4.尾删函数

        如果size等于0了就说明顺序表中没有数据了,所以

void SeqListPopBack(SL* sl)
{
	assert(sl->size > 0);
	sl->size--;
}

5.头删函数

        从第二个数据开始整体往前挪以为就可以了。(要从前面开始挪):

void SeqListPopFront(SL* sl)
{
	for (int i = 1; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

6.在第pos的位置插入数据

        首先pos不能小于现有的数据个数。

        第二判断空间,满了就扩容。

        第三:从第pos个位置的数据开始(这里第pos个位置的数据在数组中的下标是pos-1) 将后面的数据整体往后挪一位。

        第四:再这个位置赋值,别忘了对size++;

void SeqListInsert(SL* sl, int pos, DataType x)
{
	//查看空间
	assert(pos <= sl->size);
	CheckSpace(sl);
	for (int end = sl->size-1; end >= pos-1; end--)//这里不能用sl->size--
	{
		sl->a[end+1] = sl->a[end];
	}
	sl->a[pos - 1] = x;
	sl->size++;
}

7.删除第pos个位置的数据

        首先pos不能小于现有数据个数

        第二:将从第pos个位置的数据开始到最后一个数据往前挪一位

        第三:对size-- 

void SeqListErase(SL* sl, int pos)
{
	assert(pos <=sl->size);
	for (int i = pos; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

8.修改第pos个位置的数据

        一:pos不能小于现有数据个数

        二:赋值。第pos个位置的数据在数组中下标是pos-1。(因为数组下表从0开始)

void SeqListModify(SL* sl, int pos, DataType x)
{
	assert(pos <= sl->size);
	sl->a[pos - 1] = x;
}

9.查找函数。

        遍历一遍看是否有这个数据,有就返回数据是第几个元素。(这里我不是返回该数据在数组中的下标,我是返回 下标+1) 

        这里我没有考虑如果有两个一样的数据的情况。

int SeqListFind(SL* sl, DataType x)
{
	for (int i = 0; i < sl->size;i++)
	{
		if (sl->a[i] == x)
		{
			i++;
			printf("在第%d个位置\n", i);
			return i;
		}
	}
	printf("没有此数据\n");
	return -1;
}

10.销毁函数

        释放sl->a之后要对它置空,因为指针free之后,free函数只是把指针指向的内存空间释放了,即内存中存储的值,但是并没有将指针的值赋为NULL,指针仍然指向这块内存。 

void SeqListDestory(SL* sl)
{
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

11.打印函数

void SeqListPrint(SL* sl)
{
	for (int i = 0; i < sl->size;i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}

三、总代码:

        菜单写的比较简单。

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>

typedef int DataType;
typedef struct SeqList
{
	DataType* a;
	int size;
	int capacity;
}SL;

void SeqListInit(SL* sl)
{
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

void SeqListPrint(SL* sl)
{
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}

void CheckSpace(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		//因为capacity一开始等于0,所以先给capacity一个值
		int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
		DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
		if (tmp == NULL)
		{
			printf("开辟失败\n");
			exit(-1);
		}
		else
		{
			sl->capacity = newcapacity;
			sl->a = tmp;
		}
	}
}

void SeqListPushBack(SL* sl, DataType x)
{
	//看空间是不是满了,满了就扩容
	//if (sl->size == sl->capacity)
	//{
	//	//因为capacity一开始等于0,所以先给capacity一个值
	//	int newcapacity = sl->capacity == 0 ? 4 : sl->capacity * 2;
	//	DataType* tmp = (DataType*)realloc(sl->a, sizeof(DataType)*newcapacity);
	//	if (tmp == NULL)
	//	{
	//		printf("开辟失败\n");
	//		exit(-1);
	//	}
	//	else
	//	{
	//		sl->a = tmp;
	//	}
	//}
	//封装成一个函数
	CheckSpace(sl);
	sl->a[sl->size] = x;
	sl->size++;
}

void SeqListPushFront(SL* sl, DataType x)
{
	//因为插入的时候都要检查空间是不是满了,满了就扩容
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= 0; end--)
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[0] = x;
	sl->size++;
}

void SeqListPopBack(SL* sl)
{
	assert(sl->size > 0);
	sl->size--;
}

void SeqListPopFront(SL* sl)
{
	for (int i = 1; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

void SeqListInsert(SL* sl, int pos, DataType x)
{
	//查看空间
	assert(pos <= sl->size);
	CheckSpace(sl);
	for (int end = sl->size - 1; end >= pos - 1; end--)//这里不能用sl->size--
	{
		sl->a[end + 1] = sl->a[end];
	}
	sl->a[pos - 1] = x;
	sl->size++;
}

void SeqListErase(SL* sl, int pos)
{
	assert(pos <= sl->size);
	for (int i = pos; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

void SeqListModify(SL* sl, int pos, DataType x)
{
	assert(pos <= sl->size);
	sl->a[pos - 1] = x;
}

int SeqListFind(SL* sl, DataType x)
{
	for (int i = 0; i < sl->size; i++)
	{
		if (sl->a[i] == x)
		{
			i++;
			printf("在第%d个位置\n", i);
			return i;
		}
	}
	printf("没有此数据\n");
	return -1;
}

void SeqListDestory(SL* sl)
{
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capacity = 0;
}

void menu()
{
	printf("******************************\n");
	printf("*** 1.尾插数据  2.头插数据 ***\n");
	printf("*** 3.在第pos个位置插入数据***\n");
	printf("*** 4.尾删数据  5.头删数据 ***\n");
	printf("*** 6.在第pos个位置删除数据***\n");
	printf("*** 7.修改第pos个位置的数据***\n");
	printf("*** 8.查找数据 9.打印数据  ***\n");
	printf("********** -1.退出 ***********\n");
	printf("******************************\n");
}
int main()
{
	SL sl;
	SeqListInit(&sl);
	int option = 0;
	int x = 0;
	int pos = 1;
	while (option != -1)
	{
		menu();
		scanf("%d", &option);
		switch (option)
		{
		case 1:
			printf("请输入要插入的数据,以-1结束:\n");
			do
			{
				scanf("%d", &x);
				if (x != -1)
				{
					SeqListPushBack(&sl, x);
				}
			} while (x != -1);
			break;
		case 2:
			printf("请输入要插入的数据,以-1结束:\n");
			do
			{
				scanf("%d", &x);
				if (x != -1)
				{
					SeqListPushFront(&sl, x);
				}
			} while (x != -1);
			break;
		case 3:
			printf("请输入要插入的数据,要从第几个插入,以非正正数结束\n");
			do
			{
				scanf("%d", &x);
				scanf("%d", &pos);
				if (pos >= 0)
				{
					SeqListInsert(&sl, pos, x);
				}
			} while (pos >= 0);
			break;
		case 4:
			SeqListPopBack(&sl);
			break;
		case 5:
			SeqListPopFront(&sl);
			break;
		case 6:
			printf("请输入要删除第几个位置的数据,以非正正数结束\n");
			do
			{
				scanf("%d", &pos);
				if (pos>0)
				{
					SeqListErase(&sl, pos);
				}
			} while (pos>0);
			break;
		case 7:
			printf("请输入要修改的数据,要修改第几个数据,以非正整数结束\n");
			do
			{
				scanf("%d", &x);
				scanf("%d", &pos);
				if (pos>0)
				{
					SeqListInsert(&sl, pos, x);
				}
			} while (pos>0);
			break;
		case 8:
			printf("请输入需要查找的数据\n");
			scanf("%d", &x);
			SeqListFind(&sl, x);
			break;
		case 9:
			SeqListPrint(&sl);
			break;
		case -1:
			printf("退出\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}
	}
	SeqListDestory(&sl);
	return 0;
}

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

(0)

相关推荐

  • 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语言实现动态顺序表详解

    目录 什么是顺序表? 1. 定义顺序表结构体: 2. 初始化顺序表: 3. 销毁顺序表: 4. 打印顺序表: 5. 判断容量+扩容: 6. 头插数据: 7. 尾插数据: 8. 指定下标位置插入数据: 9. 删除数据: 10. 尾删数据: 11. 指定下标位置删除数据: 12. 查找数据: 13. 修改数据: 14. 源代码: 1. SeqList.h: 2. SeqList.cpp: 3. test.cpp: 15. 测试: 总结 什么是顺序表? 顺序表是在计算机内存中以数组的形式保存的线性表,

  • C语言顺序表的实现代码

    本文实例为大家分享了C语言实现顺序表的具体代码,供大家参考,具体内容如下 seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> #include<assert.h> #define SEQLIST_INIT_SIZE 8 #define INC_SIZE 3 //空间增量的大小 typedef int ElemType; typedef stru

  • 详解C语言之顺序表

    目录 一.思维导图 二.步骤 1.初始化 2.求表长 3.插入数据元素 4.删除数据元素 5.取出数据元素 按位查找 按位查找 所有代码 总结 一.思维导图 二.步骤 1.初始化 代码如下: void ListInit(SeqList *L) { L->size = 0; } 2.求表长 代码如下: int ListLength(SeqList L) { return L.size; } 3.插入数据元素 代码如下: int ListInsert(SeqList *L, int i, DataT

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

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

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

    目录 顺序表概念及结构 基本操作 功能实现 程序运行 顺序表概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改. 分类: 一般分为静态顺序表和动态顺序表: 静态顺序表:数组大小是固定的用完了无法增容:同时我们无法控制给数组开多少空间合适,开少了,空间不够:开多了,有回会存在空间浪费: 动态顺序表:空间是可以变动的,空间满了我们就增容:解决了静态顺序表的空间不足问题,同时也在一定程度上减少了空间浪费: 因此本篇博客主要实现

  • 新手向超详细的C语言实现动态顺序表

    目录 一.各个函数接口的实现 1.1 不太好''李姐''的"容量检测函数" 1.2 在任意位置插入的函数"坑!" 1.3 在任意位置删除数据的函数 1.4 其余简单的接口函数 二.顺序表结构体声明与定义 三.头文件的调用 一.各个函数接口的实现 1.1 不太好''李姐''的"容量检测函数" 对顺序表进行插入数据时,需要判断顺序表的容量是否充足,增加数据的同时需要反复地检测容量,所以推荐直接将以上步骤封装成一个函数. 函数实现算法:若容量大小 ==

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

    C语言实现动态顺序表的实现代码 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 静态实现:结构体内部只需两个成员,其中一个为固定大小(MAX)的数组,用来存放我们的数据.数组大小我们可以通过在头文件中改变MAX的值来改变. 动态实现:在内存中开辟一块空间,可以随我们数据数量的增多来扩容. 来看看动态的顺序表实现: 1.seqli

  • 利用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 <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++实现动态顺序表

    本文实例为大家分享了C++实现动态顺序表的具体代码,供大家参考,具体内容如下 Vector.h #pragma once #include <stdio.h> #include <iostream> #include <assert.h> #include <string.h> using namespace std; typedef int DataType; class Vector { public: Vector() :_first(NULL) ,

  • 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个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表.链表.栈.队列.字符串等. 线性表在逻辑上是线性结构,也就是连续的一条直线.但在物理结构上并不一定是连续的,线性表在物理

随机推荐