1.
2.循环链表
clist.h
#pragma once
//循环链表
//循环链表的结构体定义
typedef int ELEMTYPE;
typedef struct CNode
{
int data;
struct CNode* next;
}CNode,*PClist;
//循环链表可执行的操作
//初始化
void Init_clist(PClist pl);
//头插
bool Insert_head(PClist pl, int val);
//尾插
bool Insert_tail(PClist pl, int val);
//按位置插入
bool Insert_pos(PClist pl,int pos, int val);
//头删
bool Del_head(PClist pl);
//尾删
bool Del_tail(PClist pl);
//按位置删除
bool Del_pos(PClist pl,int pos);
//按值删除,删除第一个值为val的节点,如果不存在,返回false
bool Del_val(PClist pl, int val);
//查找,查找数值为val的节点,找到后返回其节点地址,否则返回NULL
struct CNode* Search(PClist pl, int val);
//判空
bool IsEmpty(PClist pl);
//获取循环链表有效元素个数
int Get_length(PClist pl);
//打印
void Show(PClist pl);
//清空
void Clear(PClist pl);
//销毁
void Destroy(PClist pl);
void Destroy2(PClist pl);
//寻找值为val的节点的前驱
PClist Get_prior(PClist pl, int val);
//寻找值为val的节点的后继
PClist Get_next(PClist pl, int val);
clist.cpp
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"clist.h"
//初始化
void Init_clist(PClist pl)
{
assert(pl != NULL);
if (pl == NULL) return;
pl->next = pl;
}
//头插
bool Insert_head(PClist pl, int val)
{
assert(pl != NULL);
//申请新节点
CNode* pnewnode = (CNode*)malloc(sizeof(CNode) * 1);
assert(pnewnode != NULL);
pnewnode->data = val;
//找到合适的插入位置
//头插函数不需要找插入位置
//插入
pnewnode->next = pl->next;
pl->next = pnewnode;
return true;
}
//尾插
bool Insert_tail(PClist pl, int val)
{
assert(pl != NULL);
CNode* pnewnode = (CNode*)malloc(sizeof(CNode));
assert(pnewnode != NULL);
pnewnode->data = val;
CNode* p = pl;
for (p; p->next != NULL; p = p->next);
pnewnode->next = p->next;
p->next = pnewnode;
return true;
}
//按位置插入
bool Insert_pos(PClist pl, int pos, int val)
{
assert(pl != NULL && pos >= 0 && pos <= Get_length(pl));
if (pos < 0 || pos > Get_length(pl)) return false;
CNode* pnewnode = (CNode*)malloc(sizeof(CNode) * 1);
assert(pnewnode != NULL);
pnewnode->data = val;
CNode* p = pl;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
pnewnode->next = p->next;
p->next = pnewnode;
return true;
}
//头删
bool Del_head(PClist pl)
{
assert(pl != NULL);
if (pl->next == pl) return false;
CNode* p = pl->next;
pl->next = p->next;
free(p);
p = NULL;
return true;
}
//尾删
bool Del_tail(PClist pl)
{
assert(pl != NULL && pl->next != pl);
if (pl == NULL && pl->next == pl)
{
return false;
}
CNode* p = pl;
for(p; p->next != pl; p = p->next)
{
if (p->next->next == pl)
{
break;
}
}
CNode* q = p->next;
p->next = q->next;
free(q);
q = NULL;
return true;
}
//按位置删除
bool Del_pos(PClist pl, int pos)
{
assert(pl != NULL && pos >= 0 && pos < Get_length(pl));
if (pl == NULL || pos < 0 || pos >= Get_length(pl)) return false;
CNode* p = pl;
for (int i = 0; i < pos; i++)
{
p = p->next;
}
CNode* q = p->next;
p->next = q->next;
free(q);
q = NULL;
return true;
}
//按值删除,删除第一个值为val的节点,如果不存在,返回false
bool Del_val(PClist pl, int val)
{
assert(pl != NULL);
CNode* p = Get_prior(pl, val);
if (p == NULL) return false;
CNode* q = p->next;
p->next = q->next;
free(q);
q = NULL;
return true;
}
//查找,查找数值为val的节点,找到后返回其节点地址,否则返回NULL
struct CNode* Search(PClist pl, int val)
{
assert(pl != NULL);
CNode* p = pl->next;
for (p; p != pl; p = p->next)
{
if (p->data == val)
{
return p;
}
}
return NULL;
}
//判空
bool IsEmpty(PClist pl)
{
return pl->next == pl;
}
//获取循环链表有效元素个数
int Get_length(PClist pl)
{
assert(pl != NULL);
int count = 0;
for (CNode* p = pl->next; p != pl; p = p->next)
{
count++;
}
return count;
}
//打印
void Show(PClist pl)
{
assert(pl != NULL);
for (CNode*p = pl->next; p != pl; p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
//清空
void Clear(PClist pl)
{
Destroy(pl);
}
//销毁
void Destroy(PClist pl)
{
assert(pl != NULL);
while (pl->next != pl)
{
CNode* p = pl->next;
pl->next = p->next;
free(p);
}
}
//销毁2(多申请一个临时指针)
void Destroy2(PClist pl)
{
assert(pl != NULL && pl->next != pl);
CNode* p = pl->next;
CNode* q = NULL;
while (p != pl)
{
q = p->next;
free(q);
p = q;
}
pl->next = pl;
}
//寻找值为val的节点的前驱
PClist Get_prior(PClist pl,int val)
{
assert(pl != NULL);
CNode* p = pl;
for (p; p->next != pl; p = p->next)
{
if (p->next->data == val)
{
return p;
}
}
return NULL;
}
//寻找值为val的节点的后继
PClist Get_next(PClist pl, int val)
{
assert(pl != NULL);
CNode* p = Search(pl, val);
if (p == NULL) return NULL;
return p->next;
//return p == NULL ? NULL : p->next;
}
main.cpp
//7_24
//循环链表
#include<stdio.h>
#include<typeinfo>
#include"clist.h"
int main()
{
CNode cn;
Init_clist(&cn);
for (int i = 0; i < 10; i++)
{
Insert_pos(&cn, i, i + 1);
}
Insert_head(&cn, 100);
Insert_tail(&cn, 200);
Show(&cn);
printf("length=%d\n",Get_length(&cn));
re