为什么单链表用malloc,顺序表用realloc

顺序表的扩容

void SLCheckCapacity(SL* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType)*newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}

		psl->a = tmp;
		psl->capacity = newCapacity;
	}
}

顺序表的定义

typedef struct SeqList
{
	SLDataType* a;
	int size;      // 有效数据
	int capacity;  // 空间容量
}SL;

单链表的扩容

SLNode* CreateNode(SLNDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	newnode->val = x;
	newnode->next = NULL;
	return newnode;
}

单列表的定义

typedef struct SListNode
{
	SLNDataType val;
	struct SListNode* next;
}SLNode;

原因

realloc的原地扩容异地扩容

1,往后面扩容,后面有空间直接扩容

2,后面的空间被占用,就找另一块地址,存放之前的内容和扩容后的内容,然后之前的地址自动释放,不用特意free


所以顺序表是类似数组排列,也就可以使用 psl->a[ i ] ; 来访问顺序表内其他元素。

void SLPrint(SL* psl)
{
	assert(psl);

	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

定义链表和顺序表的结构体,不一样,顺序表他有一个专门保存起始位置的指针来接收这个内存,链表直接就是个结点,主要是单链表不需要连续所以malloc就可以。

malloc分配的内存空间在逻辑上是连续的,而在物理上不连续。这也是不使用的一个原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值