无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。
无头单向非循环链表增删查改实现
头文件SLIst.h
#pragma once
#include<stdio.h>
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SListNode;
typedef struct SList
{
SListNode* head;
}SList;
void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
void SListPopBack(SList *list);
void SListPushBack(SList *list, SLTDataType x);
SListNode* SListFind(SList* plist, SLTDataType x);
// 在pos的后面进行插入
void SListInsertAfter(SListNode* pos, SLTDataType x);
// 在pos的后面进行删除
void SListEraseAfter(SListNode* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
实现函数SList.c
#include "SList.h"
#include<assert.h>
#include<stdlib.h>
void SListInit(SList* plist)
{
assert(plist);
plist->head = NULL;
}
void SListDestory(SList* plist)
{
assert(plist);
SListNode* cur = plist->head;
SListNode* next;
while (cur){
next = cur->next;
free(cur);
cur = next;
}
plist->head = NULL;
}
SListNode* BuySListNode(SLTDataType x)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
assert(node);
node->data = x;
node->next = NULL;
return node;
}
//int SListDestory(SList* plist);
//头插
void SListPushFront(SList* plist, SLTDataType x)
{
assert(plist);
SListNode* node = BuySListNode(x);
node->next = plist->head;
plist->head = node;
}
//头删
void SListPopFront(SList* plist)
{
assert(plist);
SListNode* node = plist->head;
plist->head = plist->head->next;
free(node);
}
//查找
SListNode* SListFind(SList* plist, SLTDataType x)
{
SListNode* node = plist->head;
while (node){
if (node->data == x)
return node;
node = node->next;
}
return NULL;
}
//在pos后插入
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
assert(pos);
SListNode* node = BuySListNode(x);
node->next = pos->next;
pos->next = node;
}
//在pos后删除
void SListEraseAfter(SListNode* pos)
{
assert(pos);
SListNode* old_pos = pos->next;
pos->next = pos->next->next;
free(old_pos);
}
//尾删
void SListPopBack(SList *list)
{
assert(list);
SListNode* node = list->head;
if (node == NULL)
return;
if (node->next == NULL){
list->head = NULL;
return;
}
while (node->next->next){
node = node->next;
}
free(node->next);
node->next = NULL;
}
//尾插
void SListPushBack(SList *list, SLTDataType x)
{
assert(list);
SListNode* node = BuySListNode(x);
SListNode* cur = list->head;
if (cur == NULL){
SListPushFront(list, x);
return;
}
while (cur->next){
cur = cur->next;
}
cur->next = node;
}
void SListRemove(SList* plist, SLTDataType x)
{
assert(plist);
SListNode* node = plist->head;
SListNode* cur = NULL;
while (node){
if (node->data == x){
if (node == plist->head){
plist->head = node->next;
}
else{
cur->next = node->next;
}
}
else{
cur = node;
}
node = node->next;
}
}
//打印
void SListPrint(SList* plist)
{
assert(plist);
SListNode* node = plist->head;
while (node){
printf("%d-->", node->data);
node = node->next;
}
printf("NULL\n");
}
测试 main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
#include<windows.h>
void test(){
SList slist;
SListInit(&slist);
SListPushFront(&slist, 4);
SListPushFront(&slist, 4);
SListPushFront(&slist, 2);
SListPushFront(&slist, 4);
SListPushFront(&slist, 5);
SListPushFront(&slist, 4);
SListPushFront(&slist, 7);
SListPushFront(&slist, 4);
SListPrint(&slist);
SListRemove(&slist, 4);
SListPrint(&slist);
SListPopFront(&slist);
SListPopFront(&slist);
SListPrint(&slist);
SListNode* node = SListFind(&slist, 2);
SListInsertAfter(node, 4);
SListPrint(&slist);
SListPopBack(&slist);
SListPopBack(&slist);
SListPrint(&slist);
SListPushBack(&slist, 5);
SListPushBack(&slist, 6);
SListPushBack(&slist, 7);
SListPushBack(&slist, 8);
SListPrint(&slist);
SListDestory(&slist);
SListPrint(&slist);
}
int main()
{
test();
system("pause");
return 0;
}