C语言超详细讲解顺序表的各种操作

目录
  • 顺序表是什么
  • 顺序表的结构体
  • 顺序表的接口函数
  • 顺序表相关操作的菜单
  • 顺序表的初始化
  • 添加元素
  • 陈列元素
  • 往最后加元素
  • 往前面加元素
  • 任意位置加元素
  • 删除最后元素
  • 删除前面元素
  • 删除任意元素
  • 整体代码(fun.h部分)
  • 整体代码(fun.cpp部分)
  • 整体代码(主函数部分)
  • 结果展示

顺序表是什么

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

总的来说,顺序表类似于数组,下标对应的是相应的元素(如图所示)

顺序表的结构体

typedef struct
{
	SLDataType *a;
	int size;//表示数组中存储了多少个数据
	int capacity;//数组实际存储数据的空间容量是多大
}SL;

其中的SLDataType*a的意思是可以动态开辟空间--相当于数组,因为数组表示的是首元素的地址,这里是直接换成了指针,也指的是地址和数组的意思一样!

typedef int SLDataType;//重命名,到时候方便更改类型

顺序表的接口函数

void menu();//菜单
void SeqListInit(SL*ps);//初始化
void SeqListPushBack(SL*ps, SLDataType x);//往后加元素
void SeqListPush(SL*ps, SLDataType n);//在顺序表中添加元素
void SeqListPopBack(SL*ps);//删除最后一个元素
void SeqListPushFront(SL*ps, SLDataType x);//往前面加元素
void SeqListPopFront(SL*ps);//删除第一个元素
void SepListdisplay(SL*ps);//陈列
void SeqListPushMid(SL*ps, SLDataType x,SLDataType z);//往中间加元素
void SeqListPopMid(SL*ps,SLDataType x);//删除中间某一个元素

这里只是先对一些函数进行声名,还没有进行创建函数!

顺序表相关操作的菜单

void menu()
{
	cout << "\t\t\t******************************************************************" << endl;
	cout << "\t\t\t****************   注意!每次都要先进行初始化  *******************" << endl;
	cout << "\t\t\t****************    1.输入-1  退出程序         *******************" << endl;
	cout << "\t\t\t****************    2.输入1   初始化           *******************" << endl;
	cout << "\t\t\t****************    3.输入2   添加元素         *******************" << endl;
	cout << "\t\t\t****************    4.输入3   陈列元素         *******************" << endl;
	cout << "\t\t\t****************    5.输入4   往最后加元素     *******************" << endl;
	cout << "\t\t\t****************    6.输入5   往前面加元素     *******************" << endl;
	cout << "\t\t\t****************    7.输入6   任意位置加元素   *******************" << endl;
	cout << "\t\t\t****************    8.输入7   删除最后元素     *******************" << endl;
	cout << "\t\t\t****************    8.输入8   删除前面元素     *******************" << endl;
	cout << "\t\t\t****************    8.输入9   删除任意元素     *******************" << endl;
	cout << "\t\t\t******************************************************************" << endl;
}

可以在控制台输入相关的数字进行相关的操作

顺序表的初始化

void SeqListInit(SL*ps)//初始化
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
	cout << "初始化完成" << endl;
}

顺序表初始化,首先使顺序表的指针置为空,先让顺序表的长度和容量都先置为空

添加元素

void SeqListPush(SL*ps, SLDataType n)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));//SLDataType类型(强制类型转换)的有newcapacity大小的空间
		if (tmp == NULL)
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	int k = 0;
	cout << "请进行赋值" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> k;
		ps->a[i] = k;
		ps->size++;
	}
	cout << "赋值完成" << endl;
}

此时先进行判断,如果没有空间或者空间不足,就要把把一个新的容量赋值为原来容量的二倍,如果是0就赋值为100 。relloc是扩容函数,是在ps->a后面扩容一个SLDataType类型(强制类型转换)的有newcapacity大小的空间,申请成功的话,就让指针a的地址存放新的地址tmp,此时新的地址tmp里面有扩容后的空间,再让capacity为新的容量,让ps的第一个位置放传进来函数的x,最后再让它的大小++。

陈列元素

void SepListdisplay(SL*ps)//陈列
{
	cout << "下面是您赋值的元素" << endl;
	for (int i = 0; i < ps->size; i++)
	{
		cout << ps->a[i] << " ";
	}
	cout << endl;
}

陈列元素这块很简单,直接可以通过它的下标找到它所代表的值,跟数组一样

往最后加元素

void SeqListPushBack(SL*ps, SLDataType x)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity*sizeof(SLDataType));
		if (tmp == NULL)//如果分配失败
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->size] = x;
	ps->size++;//再让它的大小++
	cout << "添加完成" << endl;
}

此时还是要先进行判断顺序表的空间够不够,要是空间不够的话,再运用realloc函数进行重新分配空间,再直接让最后一个位置里面放上传过来的元素就可以了。

往前面加元素

void SeqListPushFront(SL*ps, SLDataType x)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->size++;
	int i = 0;
	int j = ps->size;
	for (i = j; i > 0; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	cout << "添加完成" << endl;
}

往前面加元素的话,首先还是需要进行判断空间够不够,要是不够还是要运用realloc函数重新分配空间,此时要是想要在最前面添加元素的话,就需要先让它的大小++,再让从下标为0的第一个元素开始,把每一个元素都往后移动一个位置。移动完成之后,再让新的元素加入的顺序表的表头就可以了。

任意位置加元素

void SeqListPushMid(SL*ps, SLDataType x,SLDataType z)
{
	ps->size++;
	int i = 0;
	int j = ps->size - 1;
	for (i=j; i >= x; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[x] = z;
	cout << "添加完成" << endl;
}

要是想在任意位置加元素的话,我们首先应该知道我们需要进行加元素的下标,以及我们需要添加的元素,此时刚好我们的函数里面已经接收到了这两个元素,此时我们就从这个下标开始,让下标对应的元素以及下标之后的元素都往后加一个位置,此时就可以为新的元素腾出一个位置,等全部移动完成后,我们就可以把元素加进来就可以了。

删除最后元素

void SeqListPopBack(SL*ps)//删除最后一个元素
{
	if (ps->size > 0)
	{
		ps->size--;
	}
	cout << "删除完毕" << endl;
}

这一块是最简单的了,直接让顺序表的大小--就可以了。

删除前面元素

void SeqListPopFront(SL*ps)//删除第一个元素
{
	int i = 0;
	int j = ps->size;
	for (i = 1; i < j ; i++)
	{
		ps->a[i-1] = ps->a[i];
	}
	ps->size--;
	cout << "删除完毕" << endl;
}

我们这里可以直接让从下标为1以及后面的元素的位置往前面加一个位置,把第一个元素覆盖住就可以了。

删除任意元素

void SeqListPopMid(SL*ps, SLDataType x)//删除中间某一元素
{
	int i = 0, j = 0;
	for (i = x; i < ps->size ; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
	cout << "删除完毕" << endl;
}

这里的话我们已经知道我们需要删除元素的下标了,于是我们就可以从这个下标开始不包括这个下标对应的元素 ,把它们的位置往前推一个,把该元素覆盖住就可以了,最后再让大小减一。

整体代码(fun.h部分)

#pragma once
#define N 10000
typedef int SLDataType;
typedef struct
{
	SLDataType *a;
	int size;
	int capacity;
}SL;
//接口函数
void menu();//菜单
void SeqListInit(SL*ps);//初始化
void SeqListPushBack(SL*ps, SLDataType x);//往后加元素
void SeqListPush(SL*ps, SLDataType n);//在顺序表中添加元素
void SeqListPopBack(SL*ps);//删除最后一个元素
void SeqListPushFront(SL*ps, SLDataType x);//往前面加元素
void SeqListPopFront(SL*ps);//删除第一个元素
void SepListdisplay(SL*ps);//陈列
void SeqListPushMid(SL*ps, SLDataType x,SLDataType z);//往中间加元素
void SeqListPopMid(SL*ps,SLDataType x);//删除中间某一个元素

整体代码(fun.cpp部分)

#include<iostream>//顺序表的实现
#include<stdlib.h>
#include"fun.h"
using namespace std;
void menu()
{
	cout << "\t\t\t******************************************************************" << endl;
	cout << "\t\t\t****************   注意!每次都要先进行初始化  *******************" << endl;
	cout << "\t\t\t****************    1.输入-1  退出程序         *******************" << endl;
	cout << "\t\t\t****************    2.输入1   初始化           *******************" << endl;
	cout << "\t\t\t****************    3.输入2   添加元素         *******************" << endl;
	cout << "\t\t\t****************    4.输入3   陈列元素         *******************" << endl;
	cout << "\t\t\t****************    5.输入4   往最后加元素     *******************" << endl;
	cout << "\t\t\t****************    6.输入5   往前面加元素     *******************" << endl;
	cout << "\t\t\t****************    7.输入6   任意位置加元素   *******************" << endl;
	cout << "\t\t\t****************    8.输入7   删除最后元素     *******************" << endl;
	cout << "\t\t\t****************    8.输入8   删除前面元素     *******************" << endl;
	cout << "\t\t\t****************    8.输入9   删除任意元素     *******************" << endl;
	cout << "\t\t\t******************************************************************" << endl;
}
void SeqListInit(SL*ps)//初始化
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
	cout << "初始化完成" << endl;
}
void SeqListPush(SL*ps, SLDataType n)//在顺序表中加元素
{
	if (ps->size == ps->capacity)//如果没有空间或者空间不足
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;//把一个新的容量赋值为原来容量的二倍,如果是0就赋值为100
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));//relloc是扩容函数,是在ps->a后面扩容一个
		//SLDataType类型(强制类型转换)的有newcapacity大小的空间
		if (tmp == NULL)//如果分配失败
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;//申请成功的话,就让指针a的地址存放新的地址tmp,此时新的地址tmp里面有扩容后的空间
		ps->capacity = newcapacity;//再让capacity为新的容量
	}
	int k = 0;
	cout << "请进行赋值" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> k;
		ps->a[i] = k;
		ps->size++;
	}
	cout << "赋值完成" << endl;
}
void SeqListPushBack(SL*ps, SLDataType x)//往后加元素,或者也可以叫做为顺序表赋值
{
	if (ps->size == ps->capacity)//如果没有空间或者空间不足
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;//把一个新的容量赋值为原来容量的二倍,如果是0就赋值为100
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity*sizeof(SLDataType));//relloc是扩容函数,是在ps->a后面扩容一个
		//SLDataType类型(强制类型转换)的有newcapacity大小的空间
		if (tmp == NULL)//如果分配失败
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;//申请成功的话,就让指针a的地址存放新的地址tmp,此时新的地址tmp里面有扩容后的空间
		ps->capacity = newcapacity;//再让capacity为新的容量
	}
	ps->a[ps->size] = x;//让ps的第一个位置放传进来函数的x
	ps->size++;//再让它的大小++
	cout << "添加完成" << endl;
}
void SeqListPopBack(SL*ps)//删除最后一个元素
{
	if (ps->size > 0)
	{
		ps->size--;
	}
	cout << "删除完毕" << endl;
}
void SeqListPushFront(SL*ps, SLDataType x)//往前面加元素
{
	//进来先判断一下里面的空间满没有
	if (ps->size == ps->capacity)//如果没有空间或者空间不足
	{
		int newcapacity = ps->capacity == 0 ? 100 : ps->capacity * 2;//把一个新的容量赋值为原来容量的二倍,如果是0就赋值为100
		SLDataType*tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));//relloc是扩容函数,是在ps->a后面扩容一个
		//SLDataType类型的有newcapacity大小的空间
		if (tmp == NULL)//如果分配失败
		{
			cout << "分配失败" << endl;
			exit(-1);
		}
		ps->a = tmp;//申请成功的话,就让指针a的地址存放新的地址tmp,此时新的地址tmp里面有扩容后的空间
		ps->capacity = newcapacity;//再让capacity为新的容量
	}
	ps->size++;
	int i = 0;
	int j = ps->size;
	for (i = j; i > 0; i--)
	{
		ps->a[i] = ps->a[i - 1];
	}
	ps->a[0] = x;
	cout << "添加完成" << endl;
}
void SeqListPopFront(SL*ps)//删除第一个元素
{
	int i = 0;
	int j = ps->size;
	for (i = 1; i < j ; i++)
	{
		ps->a[i-1] = ps->a[i];
	}
	ps->size--;
	cout << "删除完毕" << endl;
}
void SepListdisplay(SL*ps)//陈列
{
	cout << "下面是您赋值的元素" << endl;
	for (int i = 0; i < ps->size; i++)
	{
		cout << ps->a[i] << " ";
	}
	cout << endl;
}
void SeqListPushMid(SL*ps, SLDataType x,SLDataType z)//往中间加元素
{
	ps->size++;
	int i = 0;
	int j = ps->size - 1;
	for (i=j; i >= x; i--)
	{
		ps->a[i + 1] = ps->a[i];
	}
	ps->a[x] = z;
	cout << "添加完成" << endl;
}
void SeqListPopMid(SL*ps, SLDataType x)//删除中间某一元素
{
	int i = 0, j = 0;
	for (i = x; i < ps->size ; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
	cout << "删除完毕" << endl;
}

整体代码(主函数部分)

#include<iostream>//顺序表的实现
#include<stdlib.h>
#include"fun.h"
using namespace std;
int main()
{
	SL ps;
	int n = 0, m = 0;
	int x = 0;
	menu();
	while (cin >> x)
	{
		if (x < 0)
		{
			break;
		}
		switch (x)
		{
		case 1:
			SeqListInit(&ps);
			break;
		case 2:
			cout << "请输入您要添加几个元素" << endl;
			cin >> n;
			SeqListPush(&ps, n);
			break;
		case 3:
			SepListdisplay(&ps);
			break;
		case 4:
			cout << "请输入您要在最后添加什么元素" << endl;
			cin >> n;
			SeqListPushBack(&ps, n);
			break;
		case 5:
			cout << "请输入您要在最前面添加什么元素" << endl;
			cin >> n;
			SeqListPushFront(&ps, n);
			break;
		case 6:
			cout << "请输入您要添加位置的下标以及添加的元素" << endl;
			cin >> n >> m;
			SeqListPushMid(&ps, 1, 6);
			break;
		case 7:
			SeqListPopBack(&ps);
			break;
		case 8:
			SeqListPopFront(&ps);
			break;
		case 9:
			cout << "请输入您要进行删除元素的下标" << endl;
			cin >> n;
			SeqListPopMid(&ps, n);
		default:
			cout << "您的输入有误,请重新输入" << endl;
		}
	}
	return 0;
}

结果展示

到此这篇关于C语言超详细讲解顺序表的各种操作的文章就介绍到这了,更多相关C语言顺序表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言线性表中顺序表超详细理解

    目录 一.本章重点 二.线性表 三.顺序表 四.静态顺序表接口实现 4.1顺序表初始化 4.2顺序表打印 4.3顺序表尾插 4.4顺序表尾删 4.5顺序表头插 4.6顺序表头删 4.7顺序表任意位置插入 4.8顺序表任意位置删除 五.动态顺序表接口实现 5.1顺序表的初始化 5.2顺序表打印 5.3顺序表尾插 5.4顺序表尾删 5.5顺序表头插 5.6顺序表头删 5.7顺序表任意位置插入 5.8顺序表任意位置删除 六.在线0j练习 一.移除元素(力扣) 二.合并两个有序数组(力扣) 一.本章重点

  • C语言数据结构深入探索顺序表

    目录 1.线性表 2.顺序表 2.1概念及结构 2.2 接口实现 2.2.1初始化 2.2.2 检查容量 2.2.3 顺序表打印 2.2.4 顺序表尾插 2.2.5 顺序表尾删 2.2.6 顺序表头插 2.2.7 顺序表头删 2.2.8 顺序表在pos位置插入x 2.2.9 顺序表删除pos位置的值 2.2.10 尾插.尾删.头插.头删的改进 2.2.11 顺序表查找 2.2.12 顺序表销毁 2.3 数组相关面试题 2.4 顺序表的问题及思考 1.线性表 线性表(linear list)是n个

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

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

  • C语言 超详细顺序表的模拟实现实例建议收藏

    目录 概念及结构 接口实现 1 顺序表的动态存储 2 顺序表初始化 3 顺序表的销毁 4 顺序表的尾插 5 顺序表的尾删 6 顺序表的头插 7 顺序表的头删 8 顺序表容量的检查与扩容 9 顺序表任意位置的插入 10 顺序表任意位置的删除 11 顺序表的打印 12 顺序表元素的查找 13 顺序表元素的修改 概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组 上完成数据的增删查改. 顺序表一般可以分为: 静态顺序表:使用定长数组存储元素,元素

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

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

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

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

  • C语言深入浅出讲解顺序表的实现

    目录 1.线性表 2.顺序表 2.1 概念及结构 2.2 提供接口 2.3 接口实现 今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表. 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线.但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 2.顺序表

  • C语言全面讲解顺序表使用操作

    目录 一.顺序表的结构定义 二.顺序表的结构操作 1.初始化 2.插入操作 3.删除操作 4.扩容操作 5.释放操作 6.输出 三.示例 编程环境为 ubuntu 18.04. 顺序表需要连续一片存储空间,存储任意类型的元素,这里以存储 int 类型数据为例. 一.顺序表的结构定义 size 为容量,length 为当前已知数据表元素的个数 typedef struct Vector{ int *data; //该顺序表这片连续空间的首地址 int size, length; } Vec; 二.

  • C语言超详细讲解顺序表的各种操作

    目录 顺序表是什么 顺序表的结构体 顺序表的接口函数 顺序表相关操作的菜单 顺序表的初始化 添加元素 陈列元素 往最后加元素 往前面加元素 任意位置加元素 删除最后元素 删除前面元素 删除任意元素 整体代码(fun.h部分) 整体代码(fun.cpp部分) 整体代码(主函数部分) 结果展示 顺序表是什么 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数

  • C语言超详细讲解线性表

    目录 1. 顺序表 1.1 管理结点 1.2 顺序表的插入 1.3 顺序表的删除 1.4 顺序表的扩容 2. 链表 2.1 定义 2.2 头部插入 2.3 尾部插入 2.4 任意位置插入 2.5 任意位置删除 2.6 虚头结点 1. 顺序表 顺序表是指用一段连续的地址,依次存放数据元素的线性数据结构.此种存储方式使得顺序表的物理结构与逻辑结构都是连续的. 与数组的区别:函数中的数组被存放在栈段中,而栈段有系统限制的大小(可使用ulimit -s查看系统限制的大小,单位为KB),因此顺序表往往使用

  • C++ 数据结构超详细讲解顺序表

    目录 前言 一.顺序表是什么 概念及结构 二.顺序表的实现 顺序表的缺点 几道练手题 总结 (●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串. 线性表在逻辑上是线性结构,也就是说连续的一条直线,但是在物理结构并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 本章我们来深度初体验顺序表 一.顺序表是什么 概念及结构 顺序表是一段物理地址连续的存储单元依次存储数据元素的线性

  • C语言超详细讲解数据结构中的线性表

    目录 前言 一.分文件编写 1.分文件编写概念 2.代码展示 二.动态分布内存malloc 1.初识malloc 2.使用方法 三.创建链表并进行增删操作 1.初始化链表 2.在链表中增加数据 3.删除链表中指定位置数据 四.代码展示与运行效果 1.代码展示 2.运行效果 总结 前言 计算机专业都逃不了数据结构这门课,而这门课无疑比较难理解,所以结合我所学知识,我准备对顺序表做一个详细的解答,为了避免代码过长,采用分文件编写的形式,不仅可以让代码干净利落还能提高代码可读性,先解释部分代码的含义,

  • C语言超详细讲解数据结构中双向带头循环链表

    目录 一.概念 二.必备工作 2.1.创建双向链表结构 2.2.初始化链表 2.3.动态申请节点 2.4.打印链表 2.5.销毁链表 三.主要功能 3.1.在pos节点前插入数据 尾插 头插 3.2.删除pos处节点数据 尾删 头删 3.3.查找数据 四.总代码 List.h 文件 List.c 文件 Test.c 文件 五.拓展 一.概念 前文我们已经学习了单向链表,并通过oj题目深入了解了带头节点的链表以及带环链表,来画张图总体回顾下: 在我们学习的链表中,其实总共有8种,都是单双向和带不带

  • C语言超详细讲解栈的实现及代码

    目录 前言 栈的概念 栈的结构 栈的实现 创建栈结构 初始化栈 销毁栈 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 检测栈是否为空 总代码 Stack.h 文件 Stack.c 文件 Test.c 文件 前言 栈的概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作.进行数据插入和删除操作的一端称为栈顶,另一端称为栈底.栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则.有点类似于手枪弹夹,后压进去的子弹总是最先打出,除非枪坏了. 压栈:栈的插入

  • C语言超详细讲解队列的实现及代码

    目录 前言 队列的概念 队列的结构 队列的应用场景 队列的实现 创建队列结构 队列初始化 队列销毁 入队列 出队列 队列判空 获取队列元素个数 获取队列头部元素 获取队列尾部元素 总代码 Queue.h 文件 Queue.c 文件 Test.c 文件 前言 队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列和前文所学的栈

  • C语言 超详细讲解链接器

    目录 1 什么是链接器 2 声明与定义 3 命名冲突 3.1 命名冲突 3.2 static修饰符 4 形参.实参.返回值 5 检查外部类型 6 头文件 1 什么是链接器 典型的链接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体–该实体能够被操作系统直接执行. 链接器通常把目标模块看成是由一组外部对象组成的.每个外部对象代表着机器内存中的某个部分,并通过一个外部名称来识别.因此,==程序中的每个函数和每个外部变量,如果没有被声明为static,就都是一个外部

  • C语言超详细讲解字符串相乘

    目录 前言 一. 分析思路 二.使用步骤 1.代码如下 2.memset函数 三.总结 前言 我们已经知道,正常的两位整形数据通过*相乘,C语言中int为4字节,32bit(字节),其机器码第一位为符号位,余下31位表示数字,表示范围:-2^31(-2147483648)~2^31-1(2147483647),但超过了这个范围我们该如何做呢? 提示:将数字以字符串的形式进行操作 一. 分析思路 示例: 我们把每一个数都看成是一个字符串,每一个元素为十进制数字所对应的字 符,由于是后面的元素先进行

  • C语言超详细讲解排序算法上篇

    目录 1.直接插入排序 2.希尔排序(缩小增量排序) 3.直接选择排序 4.堆排序 进入正式内容之前,我们先了解下初阶常见的排序分类 :我们今天讲前四个! 1.直接插入排序 基本思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排 序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移! 直接插入排序的特性总结: 1. 元素集

随机推荐