#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);
}