链表:是一种链式存储结构,链表每个节点的空间并不是连续的,而是通过指针把每个节点的空间串在一起。
线性表:空间是连续的。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN3EjM0YzM4gzYlZGO4MGOxYzXyQzNwETMxEzLcFTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL2M3Lc9CX6MHc0RHaiojIsJye.png)
源码:
主要思想就是:
创建一个指针,然后根据需要不停的给这个指针空间扩容。
每个元素的空间地址是连续的,这就构成了顺序表。
#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!!!