【单链表及常见操作实现(C语言)】
·
一.单链表
二.代码
头文件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//单链表
typedef int SListNodeDatetype;
typedef struct SListNode
{
SListNodeDatetype date;
struct SListNode* next;
}SLN;
//打印链表
void SLNprint(SLN* plist);
//创建新节点
SLN* SLNbuyNode(SListNodeDatetype x);
//尾插
void SLNpushBack(SLN** phead, SListNodeDatetype x);
//头插
void SLNpushFront(SLN** phead, SListNodeDatetype x);
//尾删
void SLNPopBack(SLN** phead);
//头删
void SLNPopFront(SLN** phead);
//查找
SLN* SLNFind(SLN* phead, SListNodeDatetype x);
//在指定位置pos之前插入一个节点
void SLNInsert(SLN** phead, SLN* pos, SListNodeDatetype x);
//在指定位置pos之后插入节点
void SLNInsertAfter(SLN* pos, SListNodeDatetype x);
//删除pos位置的的节点
void SLNErase(SLN** phead, SLN* pos);
//删除pos位置之后的节点
void SLNEraseAfter( SLN* pos);
//销毁链表
void SLNDestroy(SLN** phead);
实现文件
#include"SLN.h"
void SLNprint(SLN* phead)
{
SLN* pour = phead;
while (pour)
{
printf("%d->",pour->date );
pour=pour->next;
}
printf("NULL\n");
}
SLN* SLNbuyNode(SListNodeDatetype x)
{
SLN* newnode =(SLN*) malloc(sizeof(SLN));
if (newnode == NULL)
{
perror("malloc fail!");
exit(1);
}
newnode->date = x;
newnode->next =NULL;
return newnode;
}
void SLNpushBack(SLN** phead, SListNodeDatetype x)
{
assert(phead);
SLN* newnode = SLNbuyNode(x);
if (*phead == NULL)
{
*phead = newnode;
}
else
{
SLN* ptail = *phead;
while (ptail->next)
{
ptail=ptail->next;
}
ptail->next = newnode;
}
}
void SLNpushFront(SLN** phead, SListNodeDatetype x)
{
assert(phead);
SLN* newnode = SLNbuyNode(x);
newnode->next = *phead;
*phead = newnode;
}
void SLNPopBack(SLN** phead)
{
assert(phead && *phead);
if ((*phead)->next == NULL)
{
free(*phead);
*phead = NULL;
}
else
{
SLN* pre = NULL;
SLN* ptail = *phead;
while (ptail->next)
{
pre = ptail;
ptail = ptail->next;
}
pre->next = NULL;
free(ptail);
ptail = NULL;
}
}void SLNPopFront(SLN** phead)
{
assert(phead&&*phead);
SLN* next = (*phead)->next;
free(*phead);
*phead = next;
}
SLN* SLNFind(SLN* phead, SListNodeDatetype x)
{
SLN* pour = phead;
while (pour)
{
if (pour->date == x)
{
return pour;
}
pour = pour->next;
}
return NULL;
}
void SLNInsert(SLN** phead, SLN* pos, SListNodeDatetype x)
{
assert(phead && *phead);
if (pos == *phead)
{
SLNpushFront(phead,x);
}
else
{
SLN* newnode = SLNbuyNode(x);
SLN* pre = *phead;
while (pre->next != pos)
{
pre = pre->next;
}
pre->next = newnode;
newnode->next = pos;
}
}
void SLNInsertAfter(SLN* pos, SListNodeDatetype x)
{
assert(pos);
SLN* newnode = (SLN*)SLNbuyNode(x);
newnode->next = pos->next;
pos->next = newnode;
}
void SLNErase(SLN** phead, SLN* pos)
{
assert(phead && *phead&& pos);
if (pos == *phead)
{
SLNPopFront(phead);
}
else
{
SLN* pre = *phead;
while (pre->next != pos)
{
pre = pre->next;
}
pre->next = pos->next;
free(pos);
pos = NULL;
}
}
void SLNEraseAfter(SLN* pos)
{
assert(pos&&pos->next);
SLN* der = pos->next;
pos->next = der->next;
free(der);
}
void SLNDestroy(SLN** phead)
{
SLN* der = *phead;
while (der)
{
SLN* next = der->next;
free(der);
der = next;
}
*phead = NULL;
}
测试文件
#include"SLN.h"
void test01()//尾插
{
SLN* pplist = NULL;
printf("操作之前:");
SLNprint(pplist);
SLNpushBack(&pplist, 1);
SLNpushBack(&pplist, 44);
SLNpushBack(&pplist, 33);
SLNpushBack(&pplist, 22);
SLNpushBack(&pplist, 12);
printf("操作之后:");
SLNprint(pplist);
}
void test02()//头插
{
SLN* pplist = NULL;
printf("操作之前:");
SLNprint(pplist);
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之后:");
SLNprint(pplist);
}
void test03()//尾删
{
SLN* pplist = NULL;
SLNpushBack(&pplist, 33);
SLNpushBack(&pplist, 35);
SLNpushBack(&pplist, 43);
SLNpushBack(&pplist, 323);
SLNpushBack(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLNPopBack(&pplist);
SLNPopBack(&pplist);
printf("操作之后:");
SLNprint(pplist);
}
void test04()//头删
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLNPopFront(&pplist);
SLNPopFront(&pplist);
printf("操作之后:");
SLNprint(pplist);
}
void test05()//查找
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLN* find = SLNFind(pplist, 35);
if (find)
{
printf("找到了,地址:%p\n", find);
}
else
{
printf("没找到\n");
}
}
void test06()//在指定位置pos之前插入一个节点
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLN* find = SLNFind(pplist, 35);
if (find)
{
printf("找到了,地址:%p\n", find);
}
else
{
printf("没找到\n");
}
SLNInsert(&pplist, find, 66);
printf("操作之后:");
SLNprint(pplist);
}
void test07()//在指定位置pos之后插入节点
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLN* find = SLNFind(pplist, 35);
if (find)
{
printf("找到了,地址:%p\n", find);
}
else
{
printf("没找到\n");
}
SLNInsertAfter(find, 66);
printf("操作之后:");
SLNprint(pplist);
}
void test08()//删除pos位置的的节点
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLN* find = SLNFind(pplist, 35);
if (find)
{
printf("找到了,地址:%p\n", find);
}
else
{
printf("没找到\n");
}
SLNErase(&pplist, find);
printf("操作之后:");
SLNprint(pplist);
}
void test09()//删除pos位置之后的节点
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLN* find = SLNFind(pplist, 35);
if (find)
{
printf("找到了,地址:%p\n", find);
}
else
{
printf("没找到\n");
}
SLNEraseAfter(find);
printf("操作之后:");
SLNprint(pplist);
}
void test10()//销毁链表
{
SLN* pplist = NULL;
SLNpushFront(&pplist, 33);
SLNpushFront(&pplist, 35);
SLNpushFront(&pplist, 43);
SLNpushFront(&pplist, 323);
SLNpushFront(&pplist, 43);
printf("操作之前:");
SLNprint(pplist);
SLNDestroy(&pplist);
printf("操作之后:");
SLNprint(pplist);
}
int main()
{
test01();
test02();
test03();
test04();
test05();
test06();
test07();
test08();
test09();
test10();
return 0;
}
运行结果截图(VS2022 Debug X64)

更多推荐
所有评论(0)