目录
Test.c主函数
test5
test6
test7
test8
test9
Test.c总代码
SList.h头文件&函数声明
头文件
函数声明
SList.h总代码
SList.c函数实现
查询SLFind
pos前面插入
pos后面插入
pos后面删除
pos删除
空间释放
SList.c总代码
今天链表。
#include"SList.h"
int main()
{
SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
test5(&phead);//测试查找
test6(&phead);//测试在pos前面插入
test7(&phead);//测试在pos后面插入
test8(&phead);//测试删除pos后面的元素
test9(&phead);//测试删除pos的元素
return 0;
}
void test5(SLNode** pphead)//测试查找
{
SLNode*ret=SLFind(*pphead, 77);
if (ret != NULL)
{
printf("找到了:%d\n", ret->val);
}
else
{
printf("没找到\n");
}
}
void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLInsert(pphead, ret, 34);
SLNode* pos = SLFind(*pphead, 34);
SLInsert(pphead, pos, 78);
SLPrint(*pphead);
}
void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLInsertAfter(pphead, ret, 99);
SLPrint(*pphead);
}
void test8(SLNode** pphead)//测试删除pos后面的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLEraseAfter(pphead, ret);//99
SLPrint(*pphead);
}
void test9(SLNode** pphead)//测试删除pos的元素
{
SLNode* ret = SLFind(*pphead, 78);
SLErase(pphead, ret);
SLPrint(*pphead);
}
#include"SList.h"
void test1(SLNode** pphead)//测试尾插
{
SLPushBack(pphead, 10);
SLPushBack(pphead, 20);
SLPushBack(pphead, 30);
SLPushBack(pphead, 40);
SLPrint(*pphead);
}
void test2(SLNode** pphead)//测试头插
{
SLPushFront(pphead, 77);
SLPushFront(pphead, 66);
SLPushFront(pphead, 55);
SLPushFront(pphead, 33);
SLPrint(*pphead);
}
//
void test3(SLNode** pphead)//测试头删
{
SLPopFront(pphead);
SLPopFront(pphead);
SLPopFront(pphead);
SLPrint(*pphead);
}
void test4(SLNode** pphead)//测试尾删
{
SLPopBack(pphead);
SLPopBack(pphead);
SLPrint(*pphead);
}
void test5(SLNode** pphead)//测试查找
{
SLNode*ret=SLFind(*pphead, 77);
if (ret != NULL)
{
printf("找到了:%d\n", ret->val);
}
else
{
printf("没找到\n");
}
}
void test6(SLNode** pphead)//测试在pos前面位置插入的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLInsert(pphead, ret, 34);
SLNode* pos = SLFind(*pphead, 34);
SLInsert(pphead, pos, 78);
SLPrint(*pphead);
}
void test7(SLNode** pphead)//测试在pos后面位置插入的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLInsertAfter(pphead, ret, 99);
SLPrint(*pphead);
}
void test8(SLNode** pphead)//测试删除pos后面的元素
{
SLNode* ret = SLFind(*pphead, 77);
SLEraseAfter(pphead, ret);//99
SLPrint(*pphead);
}
void test9(SLNode** pphead)//测试删除pos的元素
{
SLNode* ret = SLFind(*pphead, 78);
SLErase(pphead, ret);
SLPrint(*pphead);
}
int main()
{
SLNode* phead = NULL;//结构体指针变量存放结构体的地址 头节点
test1(&phead);//测试尾插
test2(&phead);//测试头插
test3(&phead);//测试尾删
test4(&phead);//测试头删
test5(&phead);//测试查找
test6(&phead);//测试在pos前面插入
test7(&phead);//测试在pos后面插入
test8(&phead);//测试删除pos后面的元素
test9(&phead);//测试删除pos的元素
return 0;
}
#pragma once
#include
#include
#include
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
//空间释放
void SLDestroy(SLNode** pphead);
#pragma once
#include
#include
#include
//创建单链表
typedef int SLNDataType;//单链表节点数据类型
typedef struct SListNode//创建节点
{
SLNDataType val;
struct SListNode* next;
}SLNode;
//打印数据
void SLPrint(SLNode* phead);
//尾插
void SLPushBack(SLNode** pphead, SLNDataType x);
//头插
void SLPushFront(SLNode** pphead, SLNDataType x);
//头删
void SLPopFront(SLNode** pphead);
//尾删
void SLPopBack(SLNode** pphead);
//找到某个数值在单链表
SLNode* SLFind(SLNode* phead, SLNDataType x);
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x);
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x);
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos);
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos);
//空间释放
void SLDestroy(SLNode** pphead);
//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
SLNode* cur = phead;
while(cur)
{
if (cur->val == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
//严格限定单链表里面必须有一个有效节点
assert(pphead);//应该没有人喝醉酒了吧
assert(*pphead);
assert(pos);
SLNode* newnode = CreateNode(x);
SLNode* cur = *pphead;
SLNode* prve = NULL;
//适合中间和尾
if (prve)
{
while (cur != pos)
{
prve = cur;
cur = cur->next;
}
prve->next = newnode;
newnode->next = cur;
}
else
{
//头插
SLPushFront(pphead, x);
}
}
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
//严格限定单链表里面必须有一个有效节点
assert(pphead);//应该没有人喝醉酒了吧
assert(*pphead);
assert(pos);
SLNode* newnode = CreateNode(x);
newnode->next = pos->next;
pos->next = newnode;
//头和尾都不用处理。
}
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
//pos在最后一个不可
assert(pos->next);
assert(pos);
SLNode* tmp = pos->next;
pos->next = pos->next->next;
free(tmp);
tmp = NULL;
}
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
assert(pos);
SLNode* cur = *pphead;
SLNode* prve = NULL;
if (prve)
{
while (cur != pos)
{
prve = cur;
cur = cur->next;
}
prve->next = cur->next;
free(pos);
pos = NULL;
}
else
{
*pphead = pos->next;
free(pos);
pos = NULL;
}
}
//空间释放
void SLDestroy(SLNode** pphead)
{
assert(*pphead);
SLNode* cur = *pphead;
while (cur)
{
SLNode* tmp = cur->next;
free(cur);
cur = tmp;//cur=cur->next
}
}
#include"SList.h"
void SLPrint(SLNode* phead)
{
assert(phead);
SLNode* tail = phead;
printf("phead->");
while (tail->next != NULL)
{
printf("%d->", tail->val);
tail = tail->next;
}
printf("NULL");
printf("\n");
}
//创建链表的节点---结构体
SLNode* CreateNode(SLNDataType x)
{
SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
if (newnode == NULL)
{
perror("malloc");
return;
}
newnode->val = x;
newnode->next = NULL;
return newnode;
}
//测试尾插
void SLPushBack(SLNode** pphead, SLNDataType x)
{
//assert(*pphead);
SLNode* newnode = CreateNode(x);
//无节点
if (*pphead == NULL)
{
*pphead = newnode;
}
//多个节点
else
{
SLNode* tail = *pphead;
while (tail->next != NULL)
{
tail = tail->next;
}
tail->next = newnode;
}
}
//头插
void SLPushFront(SLNode** pphead, SLNDataType x)
{
//assert(*pphead);
SLNode* newnode = CreateNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
//---删除就涉及空间的释放---断言(删过头)
//头删
void SLPopFront(SLNode** pphead)
{
assert(*pphead);
SLNode* tail = *pphead;
*pphead = (*pphead)->next;
free(tail);
tail = NULL;
}
//尾删
void SLPopBack(SLNode** pphead)
{
assert(*pphead);
//一个节点
if ((*pphead)->next == NULL)
{
free(*pphead);
*pphead = NULL;
}
else
{
SLNode* tail = *pphead;
SLNode* prve = NULL;//虽然这里prve置为NULL和tail都是一样,但是在OJ题目当中会出错
while (tail->next != NULL)
{
prve = tail;
tail = tail->next;
}
prve->next = NULL;
free(tail);
tail = NULL;
}
}
//在单链表中查找某个数字
//找到了返回这个链表的地址
//没找到返回NULL
SLNode* SLFind(SLNode* phead, SLNDataType x)
{
SLNode* cur = phead;
while(cur)
{
if (cur->val == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
//在pos的前面插入
void SLInsert(SLNode** pphead, SLNode*pos,SLNDataType x)
{
//严格限定单链表里面必须有一个有效节点
assert(pphead);//应该没有人喝醉酒了吧
assert(*pphead);
assert(pos);
SLNode* newnode = CreateNode(x);
SLNode* cur = *pphead;
SLNode* prve = NULL;
//适合中间和尾
if (prve)
{
while (cur != pos)
{
prve = cur;
cur = cur->next;
}
prve->next = newnode;
newnode->next = cur;
}
else
{
//头插
SLPushFront(pphead, x);
}
}
//在pos的后面插入
void SLInsertAfter(SLNode** pphead, SLNode* pos, SLNDataType x)
{
//严格限定单链表里面必须有一个有效节点
assert(pphead);//应该没有人喝醉酒了吧
assert(*pphead);
assert(pos);
SLNode* newnode = CreateNode(x);
newnode->next = pos->next;
pos->next = newnode;
//头和尾都不用处理。
}
//删除pos的后面位置
void SLEraseAfter(SLNode** pphead, SLNode* pos)
{
//pos在最后一个不可
assert(pos->next);
assert(pos);
SLNode* tmp = pos->next;
pos->next = pos->next->next;
free(tmp);
tmp = NULL;
}
//删除pos位置
void SLErase(SLNode** pphead, SLNode* pos)
{
assert(pos);
SLNode* cur = *pphead;
SLNode* prve = NULL;
if (prve)
{
while (cur != pos)
{
prve = cur;
cur = cur->next;
}
prve->next = cur->next;
free(pos);
pos = NULL;
}
else
{
*pphead = pos->next;
free(pos);
pos = NULL;
}
}
//空间释放
void SLDestroy(SLNode** pphead)
{
assert(*pphead);
SLNode* cur = *pphead;
while (cur)
{
SLNode* tmp = cur->next;
free(cur);
cur = tmp;//cur=cur->next
}
}
最近改bug改的想砸电脑,保持冷静。下篇博客我们将继续链表其他类型。好好学习,天天向上。
代码---------→【唐棣棣 (TSQXG) - Gitee.com】
联系---------→【邮箱:[email protected]】