文章目录
链表概念
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。
链表也是顺序表的一种。
主要和数组顺序表对比。
链表有单向、双向;带头、不带头;循环、不循环几种,可以有8种组合:
实际中最常用的两种结构是单向无头链表和双向带头循环链表这两种结构
这里实现这两种链表
单链表结构定义
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SLTNode;
需要实现的单链表的接口有
- 动态申请节点
- 打印
- 尾插
- 尾删
- 头插
- 头删
- 查找
- 插入(pos前插入和pos后插入)
- 删除pos位置节点
申请节点
SLTNode* BuyListNode(SLTNode x)
{
SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
if(newnode == NULL)
{
perror("malloc fail");
exit(-1);
}
newnode->data = x;
newnode->next =NULL;
return newnode;
}
单链表打印
void SListPrint(SLTNode* phead)
{
SLTNode* cur = phead;
while(cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
单链表尾插
虽然无头单链表由于没有哨兵节点(头节点)使得在实际代码中需要分别处理链表为空和不为空的情况比较麻烦,正是为了处理空链表尾插的情况我们需要二级指针给函数。(如果使用返回值返回插入后的链表则可以传一级指针)
但是时间复杂度是O(1),这一点和顺序表一样。