C语言实现顺序表的插入删除

目录
  • 一、初始化顺序表属性
  • 二、顺序表的插入
  • 三、删除

首先声明一个顺序表的结构 (数组的第一个元素是0,但是顺序表的第一个一般 从1(人为设定)开始)

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

#define MAXSIZE 10
#define OK	  1
#define FALSE 0 

typedef int Elemtype;
typedef bool Status;

typedef struct list
{
	Elemtype *elem;
	int len;        //数据个数
	int listsize;   //顺序表长度
}List;
  • listsize 代表这个顺序表的最大容量,可以随时扩容
  • len 代表在你创建的这个顺序表中有几个有效的数据,总是小于等于listsize

一、初始化顺序表属性

void list_init(List *L)
{
	L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间
	if(L->elem==NULL)//判断空间是否开辟成功
	{
		printf("malloc fail\n");
		exit(0);
	}

	L->len=0;	//初始化数据有效数据为0
	L->listsize=MAXSIZE;	//初始化数组长度为MAXSIZE
}

二、顺序表的插入

Status list_insert(List *L,int i,Elemtype data)
{
	Elemtype *base,*insert,*p;
	if(i<1 || i>L->len+1 || L==NULL)
	{
		printf("位置输入错误\n");
		return FALSE;
	}
	if(L->len > L->listsize)
	{
		base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));//动态扩容
		L->elem=base;
		L->listsize+=MAXSIZE;//更新顺序表大小
	}
	insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址
	  //指向最后一个元素的地址
	for(p=L->elem + L->len-1;p>=insert;p--)
	{
		*(p+1)=*p;
	}
	*insert=data;
	L->len++;
	return OK;
}

三、删除

Status delete_list(List *L,int i)
{
	ElemType *q,*delete_i;
	if(L==NULL||i<0||i>L->len)
	return FALSE;
	delete_i=&(L->elem[i-1]);//用指针指向要删除位置的地址
	q=L->elem + L->len-1;    //q指针指向顺序表最后一个位置的地址   首地址加上数组长度就是最后一个元素地址
	for(delete_i=delete_i+1;delete_i<=q;++delete_i)//从删除位置的地址的下一个元素开始,每个往前移动一位
	{
		*(delete_i-1)=*delete_i;		//前一个位置等于后一个
	}
	L->len--;

	return OK;
}

全部程序

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

#define MAXSIZE 10
#define OK	  1
#define FALSE 0 

typedef int Elemtype;
typedef bool Status;

typedef struct list
{
	Elemtype *elem;
	int len;
	int listsize;
}List;

void list_init(List *L)
{
	L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间
	if(L->elem==NULL)//判断空间是否开辟成功
	{
		printf("malloc fail\n");
		exit(0);
	}

	L->len=0;	//初始化数据有效数据为0
	L->listsize=MAXSIZE;	//初始化数组长度为MAXSIZE
}

Status list_insert(List *L,int i,Elemtype data)
{
	Elemtype *base,*insert,*p;
	if(i<1 || i>L->len+1 || L==NULL)
	{
		printf("位置输入错误\n");
		return FALSE;
	}
	if(L->len > L->listsize)
	{
		base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));
		L->elem=base;
		L->listsize+=MAXSIZE;
	}
	insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址
	  //指向最后一个元素的地址
	for(p=L->elem + L->len-1;p>=insert;p--)
	{
		*(p+1)=*p;
	}
	*insert=data;
	L->len++;
	return OK;
}

Status list_delete(List *L,int i)
{
	Elemtype *aim,*p;
	if(i<0 || i>L->len)
	{
		printf("位置输入错误\n");
		return FALSE;
	}
	aim=&(L->elem[i-1]);//目标指针指向要删除的目标地址
	p=(L->elem+L->len-1); //指向最后一个元素的地址
	for(aim=aim+1;aim<=p;++aim) //目标地址滑动删除
	{
		*(aim-1)=*aim;
	}
	L->len--;
	return OK;
}
void show_list(List *L)
{
	int i;
	for(i=0;i<L->len;i++)
	{
		printf("elem[%d]=%d\n",i+1,L->elem[i]);
	}
	printf("\n");
}
int main()
{
	int i;
	List L;
	list_init(&L);
	for(i=0;i<10;i++)
	{
		list_insert(&L,i+1,i+1);
	}
	printf("插入前的顺序表\n");
	show_list(&L);

	printf("插入后的顺序表  在5位置插入99\n");
	list_insert(&L,5,99);
	show_list(&L);

	printf("删除后的顺序表  把5位置删除\n");
	list_delete(&L,5);
	show_list(&L);
	return 0;
}
 

运行结果如下

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • 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语言数据结构之顺序表和单链表

    一.顺序表的创建.删除和插入 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct sqlist { int date[10]; int length; }; void InitList(sqlist& L) { for (int i = 0;i < 10;i++) { L.date[i] = 0; } L.length = 0; } void charu(sqlist& L) { for (int j =

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

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

  • C语言实现顺序表的插入删除

    目录 一.初始化顺序表属性 二.顺序表的插入 三.删除 首先声明一个顺序表的结构 (数组的第一个元素是0,但是顺序表的第一个一般 从1(人为设定)开始) #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define OK 1 #define FALSE 0 typedef int Elemtype; typedef bool Status; typedef struct list { Elemtype *elem

  • 利用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语言实现顺序表的基本操作指南(注释很详细)

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

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

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

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

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

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

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

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

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

  • 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

随机推荐