目录
一.链表概念简述
链表:一组地址连续的存储单元依次存储线性表的数据元素,通常称这种结构为顺序表。
特点:逻辑上相邻的数据
线性表一般包括:基地址以及长度。
二.链表的定义及其相关操作实现
1.链表的定义
代码实现:
typedef int SLDataType; //统一修改,比如你想存放double,char等等。
typedef struct SeqList
{
SLDataType * a;
int size; //有效数据的个数
int capacity; //容量
}SL, SeqList;
2.链表的初始化
代码实现:
void SeqListInit(SL* ps)
{
ps->a = (SLDataType *)malloc(sizeof(SLDataType)* 4);
if (ps->a == NULL)
{
printf("申请内存失败\n");
exit(-1);
}
ps->size = 0;
ps->capacity = 4;
}
3.链表的插入(头插,尾插)
那么这里的动态内存开辟该怎么来实现呢?
代码实现:
//扩容
void SeqListCheckCapacity(SL* ps)
{
if (ps->size >= ps->capacity)
{
ps->capacity *= 2;
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType)* ps->capacity);
if (ps->a == NULL)
{
printf("扩容失败\n");
exit(-1);
}
}
}
//插入
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos <= ps->size && pos >= 0); //插入位置的限制
SeqListCheckCapacity(ps); //检查顺序表是否足够大,如果不够,为它扩容
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end+1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
4.链表的删除(头删,尾删)
代码实现:
//删除
void SeqListErase(SL* ps, size_t pos) // size_t => unsigned int
{
assert(ps);
assert(pos < ps->size);
int start = pos;
while (start < ps -> size - 1)
{
ps->a[start] = ps->a[start+1];
start++;
}
ps->size--;
}
5.链
目录
表的查找
代码实现:
//顺序表的查找
int SeqListFind(SL* ps, SLDataType x)
{
assert(ps);
int i = 0;
while (i < ps->size)
{
if (ps->a[i] == x)
{
return i;
}
i++;
}
return -1;
}
三.源代码
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//声明
//顺序表,有效数组在数组中必须是连续的
//动态顺序表设计(大小可变)
typedef int SLDataType; //统一修改,比如你想存放double,char等等。
//定义结构体
typedef struct SeqList
{
SLDataType * a;
int size; //有效数据的个数
int capacity; //容量
}SL, SeqList;
//初始化
void SeqListInit(SL* ps)
{
ps->a = (SLDataType *)malloc(sizeof(SLDataType)* 4);
if (ps->a == NULL)
{
printf("申请内存失败\n");
exit(-1);
}
ps->size = 0;
ps->capacity = 4;
}
//扩容
void SeqListCheckCapacity(SL* ps)
{
if (ps->size >= ps->capacity)
{
ps->capacity *= 2;
ps->a = (SLDataType*)realloc(ps->a, sizeof(SLDataType)* ps->capacity);
if (ps->a == NULL)
{
printf("扩容失败\n");
exit(-1);
}
}
}
//打印顺序表
void SeqListPrint(SL* ps)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
//插入
void SeqListInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos <= ps->size && pos >= 0);
SeqListCheckCapacity(ps); //检查顺序表是否足够大,如果不够,为它扩容
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end+1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
//删除
void SeqListErase(SL* ps, size_t pos) // size_t => unsigned int
{
assert(ps);
assert(pos < ps->size);
int start = pos;
while (start < ps -> size - 1)
{
ps->a[start] = ps->a[start+1];
start++;
}
ps->size--;
}
//顺序表的查找
int SeqListFind(SL* ps, SLDataType x)
{
assert(ps);
int i = 0;
while (i < ps->size)
{
if (ps->a[i] == x)
{
return i;
}
i++;
}
return -1;
}
//测试头尾
void TestSeqList1()
{
SeqList s; //定义一个结构体变量
SeqListInit(&s); //初始化
SeqListInsert(&s, 0, 1); //插入
SeqListInsert(&s, 1, 2);
SeqListInsert(&s, 2, 3);
SeqListInsert(&s, 3, 4);
SeqListInsert(&s, 4, 5);
SeqListPrint(&s); //打印
SeqListErase(&s, 4); //删除
SeqListErase(&s, 3);
SeqListPrint(&s); //打印
int pos = SeqListFind(&s, 3);//如果顺序表里有3这个元素,则把它删除
if (pos != -1)
{
SeqListErase(&s, pos);
}
SeqListPrint(&s);}
//主函数
int main()
{
TestSeqList1();
return 0;
}