目录
今天链表。
#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】
联系---------→【邮箱:2784139418@qq.com】