目录
单链表的接口
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int SlistDateType;
typedef struct SlistNode
{
struct SlistNode* next;
SlistDateType data;
}Slist;
//单链表不需要初始化
//获取一个结点
Slist* GetSlistNode(SlistDateType x);
//头插
void Slistpush_front(Slist** s, SlistDateType x);
//头删
void Slistpop_front(Slist** s);
//尾插
void Slistpush_back(Slist** s, SlistDateType x);
//尾删
void Slistpop_back(Slist** s);
//查找数据
Slist* Slistfind(Slist* s, SlistDateType x);
//pos位置之前插入
void Slistinsert(Slist** s, Slist* pos, SlistDateType x);
//pos位置之后插入
void Slistinsertafter(Slist* pos, SlistDateType x);
//pos位置删除
void Slisterase(Slist** s, Slist* pos);
//打印单链表
void Slistprint(Slist* s);
//销毁单链表
void Slistdestroy(Slist** s);
注:因为在pos之前插入数据我们需要一个prev来记录之前的结点位置,所以实际中我们使用的是在pos后面插入数据
接口的实现
#define _CRT_SECURE_NO_WARNINGS
#include"Slist.h"
//获取一个结点
Slist* GetSlistNode(SlistDateType x)
{
Slist* s = (Slist*)malloc(sizeof(Slist));
if (s == NULL)
{
printf("malloc faild\n");
exit(0);
}
s->data = x;
s->next = NULL;
return s;
}
//头插
void Slistpush_front(Slist** s, SlistDateType x)
{
assert(s);
Slist* newnode = GetSlistNode(x);
if (*s == NULL)
{
*s = newnode;
}
else
{
newnode->next = *s;
*s = newnode;
}
}
//头删
void Slistpop_front(Slist** s)
{
assert(s);
assert(*s);
Slist* del = *s;
*s = (*s)->next;
free(del);
del = NULL;
}
//尾插
void Slistpush_back(Slist** s, SlistDateType x)
{
assert(s);
Slist* newnode = GetSlistNode(x);
if (*s == NULL)
{
*s = newnode;
}
else
{
Slist* tail = *s;
while (tail->next)
{
tail = tail->next;
}
tail->next = newnode;
}
}
//尾删
void Slistpop_back(Slist** s)
{
assert(s);
assert(*s);
Slist* prev = *s;
Slist* tail = *s;
tail = tail->next;
while (tail->next)
{
prev = prev->next;
tail = tail->next;
}
prev->next = NULL;
free(tail);
tail = NULL;
}
//查找数据
Slist* Slistfind(Slist* s, SlistDateType x)
{
Slist* tail = s;
while (tail)
{
if (tail->data == x)
{
return tail;
}
tail = tail->next;
}
return NULL;
}
//pos位置之前插入
void Slistinsert(Slist** s, Slist* pos, SlistDateType x)
{
assert(s);
assert(pos);
Slist* prev = *s;
if (prev == pos)
{
Slistpush_front(s, x);
return;
}
while (prev->next != pos)
{
prev = prev->next;
}
Slist* newnode = GetSlistNode(x);
prev->next = newnode;
newnode->next = pos;
}
//pos位置之后插入
void Slistinsertafter(Slist* pos, SlistDateType x)
{
assert(pos);
Slist* newnode = GetSlistNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
//删除pos位置
void Slisterase(Slist** s, Slist* pos)
{
assert(s);
Slist* prev = *s;
if (pos == *s)
{
Slist* del = *s;
*s = (*s)->next;
free(del);
del = NULL;
return;
}
while (prev->next != pos)
{
prev = prev->next;
}
Slist* del = pos;
prev->next = pos->next;
free(del);
}
//打印单链表
void Slistprint(Slist* s)
{
Slist* cur = s;
while (cur)
{
printf("%d ", cur->data);
cur = cur->next;
}
}
//销毁单链表
void Slistdestroy(Slist** s)
{
assert(s);
assert(*s);
Slist* del = *s;
while (*s)
{
*s = (*s)->next;
free(del);
del = NULL;
}
}