Head.h
Main.c
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
// 值类型
typedef int DataType;
typedef struct SListNode {
DataType data; // 值
struct SListNode *next; // 指向下一个结点
};
typedef struct SListNode ListNode;
typedef ListNode *LinkList;
// 初始化
void SListInit(LinkList *p);
// 销毁
void SListDestroy(LinkList *p);
// 尾部插入
void SListPushBack(LinkList *p, DataType data);
// 头部插入
void SListPushFront(LinkList *p, DataType data);
// 尾部删除
void SListPopBack(LinkList *p);
// 头部删除
void SListPopFront(LinkList *p);
// 给定结点插入,插入到结点前
void SListInsert(LinkList *p, ListNode *pPos, DataType data);
// 给定结点删除
void SListErase(LinkList *p, ListNode *pPos);
// 按值删除,只删遇到的第一个
void SListRemove(LinkList *p, DataType data);
// 按值删除,删除所有的
void SListRemoveAll(LinkList *p, DataType data);
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
ListNode* SListFind(LinkList p, DataType data);
//打印
void Print(LinkList p);
SListNode.h
#include "Head.h"
// 初始化
void SListInit(LinkList *p)
{
assert(p);
*p = NULL;
}
// 销毁
void SListDestroy(LinkList *p)
{
assert(p);
ListNode *node, *next;
node = *p;
while (node != NULL)
{
next = node->next;
free(node);
node = next;
}
*p = NULL;
}
//创建新节点
ListNode * creatNewNode(DataType data)
{
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
assert(newNode);
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 尾部插入
void SListPushBack(LinkList *p, DataType data)
{
assert(p);
ListNode *newNode = creatNewNode(data);
if (*p == NULL)
{
*p = newNode;
return;
}
ListNode *node;
node = *p;
while (node->next)
{
node = node->next;
}
node->next = newNode;
}
// 头部插入
void SListPushFront(LinkList *p, DataType data)
{
assert(p);
ListNode *newNode = creatNewNode(data);
newNode->next = *p;
*p = newNode;
}
// 尾部删除
void SListPopBack(LinkList *p)
{
assert(p);
assert(*p);
ListNode *node = *p;
if (node->next == NULL)
{
free(node);
node = NULL;
}
while (node->next->next != NULL)
{
node = node->next;
}
free(node->next);
node->next = NULL;
}
// 头部删除
void SListPopFront(LinkList *p)
{
assert(p);
assert(*p);
ListNode *oldNode = *p;
(*p) = (*p)->next;
free(oldNode);
}
// 给定结点插入,插入到结点前
void SListInsert(LinkList *p, ListNode *pPos, DataType data)
{
assert(p);
assert(*p);
ListNode *node = *p;
if (pPos == node)
{
SListPushFront(p, data);
return;
}
while (node->next != pPos)
{
node = node->next;
}
ListNode *newNode = creatNewNode(data);
node->next = newNode;
newNode->next = pPos;
}
// 给定结点删除
void SListErase(LinkList *p, ListNode *pPos)
{
assert(p);
assert(*p);
if (*p == pPos)
{
SListPopFront(p);
return;
}
ListNode *preNode = *p;
while (preNode->next != pPos)
{
if (preNode->next == NULL)
{
printf("remove fail\n");
return;
}
preNode = preNode->next;
}
preNode->next = pPos->next;
free(pPos);
}
// 按值删除,只删遇到的第一个
void SListRemove(LinkList *p, DataType data)
{
assert(p);
assert(*p);
ListNode *find = SListFind(*p, data);
if (find != NULL)
{
SListErase(p, find);
}
}
// 按值查找,返回第一个找到的结点指针,如果没找到,返回 NULL
ListNode* SListFind(LinkList p, DataType data)
{
assert(p);
ListNode *node = p;
while (node != NULL)
{
if (node->data == data)
{
return node;
}
node = node->next;
}
return NULL;
}
// 按值删除,删除所有的
void SListRemoveAll(LinkList *p, DataType data)
{
assert(p);
assert(*p);
ListNode *find;
while (find = SListFind(*p, data))
{
SListErase(p, find);
}
}
void Print(LinkList p)
{
ListNode *node = p;
for (; node != NULL; node = node->next)
{
printf("%d ", node->data);
}
printf("NULL \n");
}
Main.c
#include"SListNode.h"
void test()
{
LinkList p;
SListInit(&p);
SListPushBack(&p, 1);
SListPushBack(&p, 2);
SListPushBack(&p, 3);
Print(p);
SListPushFront(&p, 3);
SListPushFront(&p, 2);
SListPushFront(&p, 1);
Print(p);
SListPopFront(&p);
SListPopFront(&p);
Print(p);
SListPopBack(&p);
SListPopBack(&p);
Print(p);
ListNode *pt = p->next;
SListInsert(&p, pt, 4);
SListInsert(&p, pt, 3);
Print(p);
SListErase(&p, pt);
Print(p);
SListRemoveAll(&p, 3);
Print(p);
}
int main()
{
test();
system("pause");
return 0;
}