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

2022-05-13 09:59:21
目录
一、初始化顺序表属性二、顺序表的插入三、删除 

首先声明一个顺序表的结构 (数组的第一个元素是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 failn");
    		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 failn");
    		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]=%dn",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位置插入99n");
    	list_insert(&L,5,99);
    	show_list(&L);
     
    	printf("删除后的顺序表  把5位置删除n");
    	list_delete(&L,5);
    	show_list(&L);
    	return 0;
    }
     

    运行结果如下

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持易采站长站。