C语言--实现线性表(动态内存分配)

线性表和链表

不明白链表的可以看我前几个博客:
链表基础1(超简单)–创建一个长度为n的单链表
链表基础2(超简单)–单链表的插入和删除
链表基础3(超简单)–单链表的逆序
链表基础4(超简单)–创建一个长度为n的双向链表(代码可运行)
链表基础5(超简单)–链表写入文件

链表:是一种链式存储结构,链表每个节点的空间并不是连续的,而是通过指针把每个节点的空间串在一起。
线性表:空间是连续的。
在这里插入图片描述

源码:

主要思想就是:
创建一个指针,然后根据需要不停的给这个指针空间扩容。
在这里插入图片描述
每个元素的空间地址是连续的,这就构成了顺序表。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"
#define LIST_SIZE 0

typedef struct mylist
{
   int * basic_addr;
   int list_length;//线性表中数据长度
   int list_size;//线性表空间大小,表示能存多少个数据,注意是个,是元素的数量不是size
}*SqList;
void creat_basic(SqList * L);//线性表的创建
void value_list(SqList * L);//线性表的赋值
void show_list(SqList L);//线性表打印
void del_list(SqList *L);//线性表销毁
void ins_list(SqList * L);//线性表插入
int main(void)
{
  SqList l;
  creat_basic(&l);
  value_list(&l);
  show_list(l);
  ins_list(&l);
  del_list(&l);
  return 0;

}

void creat_basic(SqList * L)
{

    (*L)->basic_addr=(int *)malloc(LIST_SIZE*sizeof(int));//空间大小
    if((*L)->basic_addr==NULL)
   {
      printf("malloc error\n");
      return;
   }
   else
  {
    (*L)->list_length=0;
    (*L)->list_size=LIST_SIZE;
  }

}

void value_list(SqList *L)
{
   int num;
   int * p;
   printf("请输入线性表的元素个数\n");
   scanf("%d",&num);
   if(num>(*L)->list_size)
     {
        while(1)
        {
         
          printf("(*L)->basic_addr : %p\n",(*L)->basic_addr);
          p=(int *)realloc((*L)->basic_addr,num*sizeof(int));//如果需要增加空间
          printf("p: %p\n",p);
          if(p!=NULL)
          {
              (*L)->basic_addr=p;
             (*L)->list_size++;//空间大小增加
             if((*L)->list_size>=num)
             {
               break;
             }       
          
          }
          else
          {
            printf("realloc error\n");
            return;
          }

        }
     }
     printf("\n");
     printf("(*L)->basic_addr : %p\n",(*L)->basic_addr);
  for(int i=0;i<num;i++)
  {
    printf("请输入第%d个元素:",(i+1));
    scanf("%d",&(*L)->basic_addr[i]);
  }
  (*L)->list_length=num;//实际元素个数,也就是线性表的实际长度
  printf("赋值完成\n");
  
}

void show_list(SqList L)
{
 printf("线性表内容为:\n");
 for(int i=0;i< L->list_length;i++)
 {
  printf("%d ",L->basic_addr[i]);
 }
 printf("\n");
}

void del_list(SqList *L)
{
  free((*L)->basic_addr);
  (*L)->basic_addr=NULL;
  (*L)->list_length=0;
  (*L)->list_size=0;
  printf("线性表已经销毁\n");
}

void ins_list(SqList * L)
{
 int n,m;
 int *p;
 //首先判断线性表的内存够不够用
 if((*L)->list_length>=(*L)->list_size)
 {
   (*L)->basic_addr=(int *)realloc((*L)->basic_addr,((*L)->list_length+1)*sizeof(int));
   (*L)->list_size++;
   //(*L)->list_length++;
 }
  printf("请输入要在那个元素后面插入新元素\n");
  scanf("%d",&n);
  printf("请输入要插入的新元素的数值\n");
  scanf("%d",&m);
  for(p=&((*L)->basic_addr[((*L)->list_length-1)]);*p!=n;p--)
  {
    *(p+1)=*p;
  }
  *(p+1)=m;
  (*L)->list_length++;
  printf("插入完成\n");
  show_list((*L));
}

运行结果:

在这里插入图片描述


感谢阅读!
其实有个BUG,我实在没找到解决方法。假如给初始内存分配为0(将源码里面的 #define LIST_SIZE 100 改为#define LIST_SIZE 0),后面添加多少数据开辟多少内存,结果我运行出现段错误,分析因该是堆溢出。没找到解决方法,有知道的欢迎交流,感谢ing!!!


bug已解决,源码更正! 2021/10/9 17:32


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值