数据结构(单循环链表)

#pragma once

typedef int ELEMTYPE;

typedef struct CNode {

ELEMTYPE data;

struct CNode* next;

}CNode,*PCNode;

void Init_Slink(CNode* plist);

CNode* BuyNode(ELEMTYPE val);

bool Insert_head(CNode* plist,ELEMTYPE val);

bool Insert_Tail(CNode* plist, ELEMTYPE val);

bool Insert_pos(CNode* plist, ELEMTYPE val, int pos);

bool Delete_head(CNode* plist);

bool Delete_Tail(CNode* plist);

bool Delete_pos(CNode* plist, int pos);

bool Delete_val_First(CNode* plist, ELEMTYPE val);

bool Delete_val_All(CNode* plist, ELEMTYPE val);

CNode* Search(CNode* plist, ELEMTYPE val);

bool IsEmpty(CNode* plist);

int Get_Length(CNode* plist);

void Destroy1(CNode* plist);

void Destroy2(CNode* plist);

void Show(CNode* plist);

//单循环链表 只有让其尾部节点的next指向头部

//初始状态下 若后面链表为空 则指向自己

#include<stdio.h>

#include<assert.h>

#include "Seqlist.h"

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include "Slink.h"

void Init_Slink(CNode* plist)

{

assert(plist != NULL);

plist->next =plist;

}

CNode* BuyNode(ELEMTYPE val)

{

CNode* pnewNode = (CNode*)malloc(1 * sizeof(struct CNode));

if (pnewNode == NULL)

{

exit(EXIT_FAILURE);

}

pnewNode->data = val;

pnewNode->next = NULL;

return pnewNode;

}

bool Insert_head(CNode* plist, ELEMTYPE val)

{

assert(plist != NULL);

CNode* pnewNode = BuyNode(val);

CNode* p = plist;

pnewNode->next = p->next;

p->next = pnewNode;

}

bool Insert_Tail(CNode* plist, ELEMTYPE val)

{

assert(plist != NULL);

CNode* pnewNode = BuyNode(val);

CNode* p = plist;

for (; p->next != plist; p = p->next);

pnewNode->next = p->next;//可以不写

p->next = pnewNode;

}

bool Insert_pos(CNode* plist, ELEMTYPE val, int pos)

{

assert(plist != NULL);

assert(pos >= 0 && pos <= Get_Length(plist));

CNode* pnewNode = BuyNode(val);

CNode* p = plist;

for (int i = 0; i < pos; i++)

{

p = p->next;

}

pnewNode->next = p->next;

p->next = pnewNode;

}

bool Delete_head(CNode* plist)

{

assert(plist != NULL);

if (IsEmpty(plist) == NULL)

return false;

CNode* q = plist->next;

CNode* p = plist;

p->next = q->next;

free(q);

q = NULL;

return 1;

}

bool Delete_Tail(CNode* plist)

{

assert(plist != NULL);

if (IsEmpty(plist) == NULL)

return false;

CNode* q = plist;

for (; q->next != plist; q = q->next);

CNode* p = plist;

for (; p->next !=q; p = p->next);

q->next = p->next;

free(q);

q = NULL;

return 1;

}

bool Delete_pos(CNode* plist, int pos)

{

assert(plist != NULL);

assert(pos >= 0 && pos <= Get_Length(plist));

if (IsEmpty == NULL)

return false;

CNode* p = plist;

for (int i = 0; i < pos-1; i++)

{

p = p->next;

}

CNode* q = p->next;

q->next = p->next;

free(q);

q = NULL;

return 1;

}

bool Delete_val_First(CNode* plist, ELEMTYPE val)

{

assert(plist != NULL);

CNode* q = Search(plist, val);

if (q == NULL)

return false;

CNode* p = plist;

for (; p->next != q; p = p->next);

q->next = p->next;

free(q);

q = NULL;

return 1;

}

bool Delete_val_All(CNode* plist, ELEMTYPE val)

{

assert(plist != NULL);

CNode* q = plist;

CNode* p = plist->next;

while (q != NULL)

{

if (q->data == val)

{

q->next = p->next;

free(q);

q = NULL;

}

else

{

q = q->next;

p ==p->next;

}

}

return true;

}

CNode* Search(CNode* plist, ELEMTYPE val)

{

assert(plist != NULL);

CNode* p = plist->next;

for (; p != plist; p = p->next)

{

if (p->data == val)

return p;

}

}

bool IsEmpty(CNode* plist)

{

return plist->next == NULL;

}

int Get_Length(CNode* plist)

{

int mun;

CNode* p = plist->next;

for (; p != NULL; p = p->next)

{

mun++;

}

return mun;

}

void Destroy1(CNode* plist)

{

while (!IsEmpty(plist))

{

//Del_Head;

}

}

void Destroy2(CNode* plist)

{

CNode* p = plist->next;

CNode* q = NULL;

while (p != NULL)

{

q = p->next;

free(q);

p = q;

}

}

void Show(CNode* plist)

{

CNode* p = plist;

for (; p->next != NULL; p = p->next)

printf("%d ", p->data);

}

相关推荐
海清河晏11139 分钟前
数据结构 | 单循环链表
数据结构·算法·链表
skywalker_115 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
_日拱一卒6 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾6 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
计算机安禾7 小时前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者7 小时前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
汀、人工智能7 小时前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
汀、人工智能7 小时前
[特殊字符] 第70课:加油站
数据结构·算法·数据库架构·图论·bfs·加油站
favour_you___8 小时前
2026_4_8算法练习题
数据结构·c++·算法
汀、人工智能8 小时前
[特殊字符] 第57课:搜索旋转排序数组
数据结构·算法·数据库架构·图论·bfs·搜索旋转排序数组