链表:一种链式存储的线性表,用一组地址任意的存储单元存放线性表的数据元素,称存储单元为一个节点。
typedef int SListDataType;
//链表中的一个结点
typedef struct Node {
SListDataType value;//值
struct Node *next;//下一个结点的地址
}Node;
//Single List
typedef struct SList {
Node *first;//*head 第一个结点的地址
}SList;

头插:
- 申请新节点
- 节点赋值
- 更改链表的关系(新节点变为链表的第一个节点,新节点的下一个结点指向原链表的第一个节点)
void SListPushFront(SList *slist, SListDataType v) {
//1.申请新结点
Node *node = (Node *)malloc(sizeof(Node));
node->value = v;
//2.更改链表的关系
node->next = slist->first;
slist->first = node;
}
尾插:
- 申请新节点并赋值
- 找最后一个节点并保存其地址
- 将最后一个节点连接到原链表上(新节点的下一个节点地址指向NULL,最后一个节点的下一个节点地址指向新节点)
void SListPushBack(SList *slist, SListDataType v) {
Node *node = (Node*)malloc(sizeof(Node));
node->value = v;
node->next = NULL;
if (slist->first == NULL) {
slist->first = node;
}
else {
//找原来链表的最后一个结点
Node *c = slist->first;
while (c->next != NULL) {
c = c->next;
}
c->next = node;
}
}
尾删:时间复杂度O(n)
//O(n) 尾删
void SListPopBack(SList *s) {
//排出链表中一个结点都没有的情况
assert(s->first != NULL);
//只有一个节点
if (s->first->next == NULL) {
free(s->first);
s->first = NULL;
return;
}
Node *c = s->first;
for (c = s->first; c->next->next != NULL; c = c->next) {
free(c->next);
c->next = NULL;
}
}
任意位置的插入
void SListInsertAfter(SList *s, Node *pos, SListDataType v) {
Node *node = (Node*)malloc(sizeof(Node));
node->value = v;
node->next = pos->next;
pos->next = node;
}
任意位置的删除
void SListEraseAfter(SList *s, Node *pos) {
Node *next = pos->next->next;//先存一下
free(pos->next);
pos->next = next;
}
678

被折叠的 条评论
为什么被折叠?



