链表:
定义:
typedef int SListDataType;
typedef struct SListNode {
SListDataType value; // 保存的值
struct SListNode* next; // 保存下一个结点的地址
} SListNode;
typedef struct SHead { //头结点
SListNode* first;
}SHead;
功能实现:
1.初始化
//1.初始化
int chushihua(SHead* f) {
assert(f!=NULL);
f->first = NULL;
}
2.头插
//2.头插
int HeadInsert(SHead* s, SListDataType date) {
//先给数据船创建新的结点
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
node->value = date; //结点的数据是5
node->next = s->first; //结点的下一个地址,头结点放的就是第一个元素的地址,注意first是地址
s->first = node; //这时候把头节点first指向新插入的node
return 0;
}
3.尾插
//3.尾插
int EndInsert(SHead* s,SListDataType date) {
//先给数据船创建新的结点
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
node->value = date;
node->next = NULL;
//边界判断
//链表为空的时候
if (s->first==NULL) {
s->first = node; //插入数据,就第一个就是
return;
}
//链表至少有一个节点的情况
//这时候寻找最后一个节点的位置
SListNode* arr = s->first; //临时变量
while (arr->next!=NULL) {
arr = arr->next;
}
// arr->next 一定是 NULL,也就是最后一个结点
//找到之后,最后一个结点指向新插入的数据
arr->next = node;
}
4.头删
//4.头删
int HeadDelete(SHead* s) {
//边界判断
//如果链表不存在?如果链表没有结点,没东西删除?
assert(s != NULL); //链表不存在判断
assert(s->first != NULL); //链表没有结点判断
SListNode* cur = s->first->next; //创建一个临时变量
free(s->first); //释放掉头节点
s->first = cur; //头节点重新赋值
return 0;
}
5.尾删
//5.尾删
int EndDelete(SHead* s) {
//边界判断
//1.链表为空
assert(s->first != NULL);
//2.链表不存在
assert(s != NULL);
//3.链表只有一个元素
if (s->first->next==NULL) {
free(s->first);
s->first = NULL;
return;
}
//找倒数第二个结点,利用临时结点变量
SListNode* arr = s->first;
while (arr->next->next!=NULL) {
arr = arr->next;
}
//这时候arr就是倒数第二个结点
arr->next = NULL;//指向空
free(arr->next);
return 0;
}
6.按值查询
//6.按值查询
struct SListNode* SearchSList(SHead* s,SListDataType date) {
//边界判断
//1.链表不存在
assert(s != NULL);
//2.链表为空
assert(s->first != NULL);
//注意返回值,返回值是地址,所以用的struct SListNode* ,就是next一样 放的地址
SListNode* cur = s->first;
for (cur = s->first; cur->next != NULL;cur=cur->next) {
if (cur->value = date) {
return cur;
}
}
}