C语言-数据结构-顺序表的创建、插入、删除、销毁

一 、 定义顺序表结构体

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_size 10  // 顺序表最多能存放MAX_size个Data_type类型的数据



typedef int Data_type;

typedef struct seqlist
{

	Data_type arr [MAX_size];
	int size;

}Seqlist;


enum VALUE
{
      empty_error=-7,
      create_error,
	  full_error ,
	  pos_error ,
      malloc_error ,
	  NULL_error ,
	  error,
	  ok

};

二 、结构体的创建

在定义了结构体之后,我们需要使用malloc函数对结构体进行创建。

int My_malloc(Seqlist **pplist)  //申请一片大小为顺序表大小的地址空间 参数为二级指针接受指针plist的地址
 {
     if ( NULL == pplist)
	 {
	    return NULL_error;
	 }

        *pplist   = (Seqlist *)malloc(sizeof(Seqlist));

	 if (NULL == *pplist)
	 {
	   return malloc_error;
	 }
     
	 memset (*pplist ,'\0',sizeof(Seqlist));  // 将创建的顺序表的值置为空
	 return ok;
 }

三 、顺序表的插入

实现顺序表的插入,需要将pos作为参数传入。这里值得注意的是,顺序表的插入需要指针从最后一个位置开始,从后向前遍历到pos位置。这样可以避免移动元素的过程中,前值将后值覆盖掉。

 int   Addlist(Seqlist *plist ,int pos ,Data_type data) // 在pos位置插入新值data
	 {
	
		 if (NULL == plist)
		 {
		   printf("create error");
		   return create_error;
		 }

		if (pos < 0 || pos >plist->size)
		{
		  printf("pos_error");
		  return pos_error;
		 
		}

		else if (plist->size >= MAX_size)
		{ 
		  printf("full error");
		  return full_error;
		}
		
        else
	    {
	     for (int i=plist->size-1 ;i>=pos ;i--)  //plist->size-1 指向顺序表的最后一个元素
	     {
	        
		    plist->arr[i+1]	= plist->arr[i];

	     }

		  plist->arr[pos] = data;
		  plist->size++;
	 
	    }
              
            return ok;

	 }

四、顺序表的删除

先将要删除的元素保存到deldata中,指针再从pos位置开始从前向后遍历,遍历的过程中将后面的元素前移一个位置,实现元素的覆盖。

int Delete( Seqlist *plist ,int pos, Data_type *deledata)//删除pos位置的数据用deledata接收
	                                                
   {

        if ( NULL == plist)
		{
		  printf("空指针");
		  return NULL_error;
		}

		if (pos <0 || pos >=  plist->size)
		{
		    printf("删除位置错误");
			return pos_error;
		}

		if (plist->size ==0)
		{
			printf("顺序表以空");
			return empty_error;
		}
       
	     	*deledata = plist->arr[pos];
		    for (int j=pos ;j<plist->size-1;j++)
		{
			plist->arr[j] =  plist->arr[j+1];

		}

			plist->size--;
			return ok;

  }

五、顺序表的打印和销毁 

在输入的pos非法的时候,证明操作失败,将申请好的结构体销毁,下次重新创建。操作完成后将现有的顺序表元素打印

 int My_destory(Seqlist **pplist)  // 销毁顺序表
   { 
      if (NULL == pplist)
	  {
	    return NULL_error;
	  }

	  if(NULL == *pplist)
	  {
	     return create_error;
	  }

	  free(*pplist);
	  *pplist =NULL;

	  return ok;
  
    } 

    
  void	My_show( Seqlist *plist)    // 打印顺序表
  {
       for (int i=0 ;i<plist->size;i++)
	   {
	      printf("%d",plist->arr[i]);	   
	   }
  }

六 、主函数

先创建顺序表,然后进行插入操作。在插入阶段输入pos为-1时退出插入,开始删除操作。在删除阶段输入pos为-1时,退出删除操作,程序结束。

int main (int argc ,const char *argv[])
{

	Seqlist *plist =NULL;
	int ret = My_malloc(&plist);
	if (ret<0)
	{
	  return error;
	}
 
    printf("申请空间成功!");

// 增加顺序表的元素

	int pos;
	Data_type addata;
	while(1)
	{
		   printf("请输入要插入元素的位置:");
		   scanf("%d",&pos);
           
		   if (-1 ==pos)
		   {
		     break;
		   }

		   printf("请输入要插入的元素");
		   scanf("%d",&addata);
		   int ret  =Addlist(plist ,pos ,addata);

		   if (ret<0)
		   {
			int  ret= My_destory(&plist);
                        if (ret <0)
                         {
                           printf("destory error");
                          }
                        
                         printf("销毁成功!");
			 plist =NULL;
		     return error;
		   }

		   printf("插入新元素成功!");
	       printf("目前元素为:");
		   My_show(plist);
    }


	//删除元素
	Data_type deldata;
	while(1)
	{     
		printf("输入删除元素的位置:");
	    scanf("%d",&pos);
		if(-1 == pos)
		{
			break;
		}
		int ret =	Delete(plist ,pos,&deldata);
		if (ret < 0)
		{
		   printf("删除失败");
		   return error;
		   My_destory(&plist);
		   plist =NULL;
		}

		printf("删除的元素为:%d",deldata);
		printf("删除之后的元素为:");
		My_show(plist);
	}


	
	return ok;

}

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_size 10  // 顺序表最多能存放MAX_size个Data_type类型的数据



typedef int Data_type;

typedef struct seqlist
{

	Data_type arr [MAX_size];
	int size;

}Seqlist;


enum VALUE
{
      empty_error=-7,
      create_error,
	  full_error ,
	  pos_error ,
      malloc_error ,
	  NULL_error ,
	  error,
	  ok

};


 int My_malloc(Seqlist **pplist)  //申请一片大小为顺序表大小的地址空间 参数为二级指针接受指针plist的地址
 {
     if ( NULL == pplist)
	 {
	    return NULL_error;
	 }

        *pplist   = (Seqlist *)malloc(sizeof(Seqlist));

	 if (NULL == *pplist)
	 {
	   return malloc_error;
	 }
     
	 memset (*pplist ,'\0',sizeof(Seqlist));  // 将创建的顺序表的值置为空
	 return ok;
 }

  
    int My_destory(Seqlist **pplist)  // 销毁顺序表
   { 
      if (NULL == pplist)
	  {
	    return NULL_error;
	  }

	  if(NULL == *pplist)
	  {
	     return create_error;
	  }

	  free(*pplist);
	  *pplist =NULL;

	  return ok;
  
    } 

    
  void	My_show( Seqlist *plist)    // 打印顺序表
  {
       for (int i=0 ;i<plist->size;i++)
	   {
	      printf("%d",plist->arr[i]);	   
	   }
  }



   int   Addlist(Seqlist *plist ,int pos ,Data_type data) // 在pos位置插入新值data
	 {
	
		 if (NULL == plist)
		 {
		   printf("create error");
		   return create_error;
		 }

		if (pos < 0 || pos >plist->size)
		{
		  printf("pos_error");
		  return pos_error;
		 
		}

		else if (plist->size >= MAX_size)
		{ 
		  printf("full error");
		  return full_error;
		}
		
        else
	    {
	     for (int i=plist->size-1 ;i>=pos ;i--)  //plist->size-1 指向顺序表的最后一个元素
	     {
	        
		    plist->arr[i+1]	= plist->arr[i];

	     }

		  plist->arr[pos] = data;
		  plist->size++;
	 
	    }
              
            return ok;

	 }



   int Delete( Seqlist *plist ,int pos, Data_type *deledata)//删除pos位置的数据用deledata接收
	                                                
   {

        if ( NULL == plist)
		{
		  printf("空指针");
		  return NULL_error;
		}

		if (pos <0 || pos >=  plist->size)
		{
		    printf("删除位置错误");
			return pos_error;
		}

		if (plist->size ==0)
		{
			printf("顺序表以空");
			return empty_error;
		}
       
	     	*deledata = plist->arr[pos];
		    for (int j=pos ;j<plist->size-1;j++)
		{
			plist->arr[j] =  plist->arr[j+1];

		}

			plist->size--;
			return ok;

  }



int main (int argc ,const char *argv[])
{

	Seqlist *plist =NULL;
	int ret = My_malloc(&plist);
	if (ret<0)
	{
	  return error;
	}
 
    printf("申请空间成功!");

// 增加顺序表的元素

	int pos;
	Data_type addata;
	while(1)
	{
		   printf("请输入要插入元素的位置:");
		   scanf("%d",&pos);
           
		   if (-1 ==pos)
		   {
		     break;
		   }

		   printf("请输入要插入的元素");
		   scanf("%d",&addata);
		   int ret  =Addlist(plist ,pos ,addata);

		   if (ret<0)
		   {
			int  ret= My_destory(&plist);
                        if (ret <0)
                         {
                           printf("destory error");
                          }
                        
                         printf("销毁成功!");
			 plist =NULL;
		     return error;
		   }

		   printf("插入新元素成功!");
	       printf("目前元素为:");
		   My_show(plist);
    }


	//删除元素
	Data_type deldata;
	while(1)
	{     
		printf("输入删除元素的位置:");
	    scanf("%d",&pos);
		if(-1 == pos)
		{
			break;
		}
		int ret =	Delete(plist ,pos,&deldata);
		if (ret < 0)
		{
		   printf("删除失败");
		   return error;
		   My_destory(&plist);
		   plist =NULL;
		}

		printf("删除的元素为:%d",deldata);
		printf("删除之后的元素为:");
		My_show(plist);
	}


	
	return ok;

}

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值