该链表可以实现对链表的头插的增加和删除,尾插的增加和删除,对链表进行查找,在指定位置的前后进行删除和增加。如有bug可以提出修正。
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int Datatype;
typedef struct STnode
{
Datatype data;
struct STnode* next;
}STnode;
void print(STnode* phead);//打印链表
void pushfront(STnode** pphead, Datatype x);//链表头插
void pushback(STnode** pphead, Datatype x);//链表尾插
STnode* find(STnode* pphead, Datatype x);//查找链表
void SLinsert(STnode** pphead, STnode* pos, Datatype x);//在pos之前插入
void SLinsertAfter(STnode* pos, Datatype x);//在pos之后插入
//删除pos位置的值
void STerase(STnode** pphead, STnode* pos);
//删除pos位置后面的值
void STeraseafter(STnode* pos);
#include"slist.h"
void print(STnode* phead)
{
STnode* cur = phead;
while (cur != NULL)
{
printf("%d->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
STnode* buynode(Datatype x)
{
STnode* newnode = (STnode*)malloc(sizeof(STnode));
if (newnode == NULL)
{
perror("malloc fail");
return NULL;
}
newnode->data = x;
newnode->next = NULL;
return newnode;
}
void pushfront(STnode** pphead, Datatype x)
{
assert(pphead);
STnode* newnode = buynode(x);
newnode->next = *pphead;
*pphead = newnode;
}
void pushback(STnode** pphead, Datatype x)
{
assert(*pphead);
STnode* newnode = buynode(x);
STnode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
newnode->next = NULL;
}
STnode* find(STnode* pphead, Datatype x)
{
STnode* tail = pphead;
while (tail)
{
if (tail->data == x)
{
return tail;
}
tail = tail->next;
}
return NULL;
}
//在pos之前插入
void SLinsert(STnode** pphead, STnode* pos, Datatype x)
{
assert(*pphead);
assert(pos);
STnode* prev = *pphead;
STnode* newnode = buynode(x);
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = newnode;
newnode->next = pos;
}
void SLinsertAfter(STnode* pos, Datatype x)
{
assert(pos);
STnode* newnode = buynode(x);
newnode->next = pos->next;
pos->next = newnode;
}
//删除pos位置的值
void STerase(STnode** pphead, STnode* pos)
{
assert(*pphead);
STnode* prev = *pphead;
while (prev->next != pos)
{
prev = prev->next;
}
prev->next = pos->next;
free(pos);
pos = NULL;
}
//删除pos位置后面的值
void STeraseafter(STnode* pos)
{
assert(pos);
assert(pos->next);
STnode* tail = pos->next;
pos->next = tail->next;
free(tail);
tail = NULL;
}
测试功能代码如下:
#include"slist.h"
void testprint()
{
STnode* plist = NULL;
pushfront(&plist, 1);
pushfront(&plist, 2);
pushfront(&plist, 3);
pushfront(&plist, 4);
print(plist);
pushback(&plist, 5);
pushback(&plist, 6);
pushback(&plist, 7);
pushback(&plist, 8);
STnode* pos = find(plist, 7);
SLinsert(&plist, pos, 30);
SLinsertAfter(pos, 5);
print(plist);
STerase(&plist, pos);
print(plist);
STnode* pos1= find(plist, 2);
STeraseafter(pos1);
print(plist);
}
int main()
{
testprint();
}