顺序表的扩容
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分配的内存空间在逻辑上是连续的,而在物理上不连续。这也是不使用的一个原因。