天天看点

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

 ​

链表:是一种链式存储结构,链表每个节点的空间并不是连续的,而是通过指针把每个节点的空间串在一起。

线性表:空间是连续的。

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

源码:

主要思想就是:

创建一个指针,然后根据需要不停的给这个指针空间扩容。

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

每个元素的空间地址是连续的,这就构成了顺序表。

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

运行结果:

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

感谢阅读!

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

下一篇: Oracle 外部表

继续阅读