#include<stdio.h>
#include <malloc.h>
#define MaxSize 10 //静态链表的最大长度
struct Node{ //静态链表结构类型的定义
int data; //存储数据元素
int next; //下一个元素的数组下标
};
/*
* typedef struct {
int data;
int next;
} SLinkList[MaxSize];
等价于
struct Node{
int data;
int next;
};
typedef struct Node SLinkList[MaxSize]; //结构体struct Node用typedef重命名
可用SLinkList定义一个长度为MaxSize的Node类型的数组
void test(){
SLinkList a; //a就是一个数组 == struct Node a[MaxSize];
}
*/
//双链表
typedef struct DNode {
int data;
struct DNode* prior, * next;
}DNode, * DLinkList;
//循环单链表
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
void test() {
struct Node a[MaxSize]; //数组a作为静态链表,类型为struct Node
}
//初始化循环双链表
bool InitLinkList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) return false;
L->next = L; //头结点的next指向头结点
L->prior = L;
return true;
}
//初始化循环单链表
bool InitLinkList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) return false;
L->next = L; //头结点的next指向头结点
return true;
}
//判断循环单链表是否为空
bool IsEmpty(LinkList L) {
return (L->next == L);
}
//判断循环单链表节点p是否为表尾节点
bool isTail(LinkList L, LNode* p) {
return(p->next == L);
}
//初始化双链表
bool InitDLinkList(DLinkList& L) {
L = (DNode*)malloc(sizeof(DNode));
if (L == NULL) return false;
L->prior = NULL;
L->next = NULL;
return true;
}
//判断是否为空
bool IsEmpty(DLinkList L) {
return (L->next == NULL);
}
//循环双链表的插入,在p节点之后插入s节点
bool InsertNextDNode(DNode* p, DNode* s) {
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
//双链表的插入,在p节点之后插入s节点
bool InsertNextDNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) return false;
s->next = p->next;
if(p->next != NULL) //如果p有后继结点
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
//删除p节点的后继结点
bool DeleteNextNode(DNode* p) {
if (p != NULL) return false;
DNode* q = p->next;//找到p的后继结点q
if (q == NULL) return false;
p->next = q->next;
if (q->next != NULL) //q不是最后一个节点
q->next->prior = p;
free(p);
return true;
}
//删除链表
void DestoryList(DLinkList& L) {
//循环释放各个节点数据
while (L->next != NULL)
DeleteNextNode(L);
free(L); //释放头结点
L = NULL; //头指针指向NULL
}
void test() {
DLinkList L;
InitDLinkList(L);
}
双链表,循环链表,静态链表
最新推荐文章于 2023-06-01 21:35:48 发布