文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

首先声明一个顺序表的结构 (数组的第一个元素是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;

一、初始化顺序表属性

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;
}
 

运行结果如下

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯