mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-11-01 21:07:12 +08:00
更新线性表部分
This commit is contained in:
186
Code/double_link_list.h
Normal file
186
Code/double_link_list.h
Normal file
@@ -0,0 +1,186 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 双链表结点
|
||||
typedef struct DoubleLinkNode{
|
||||
element_type data;
|
||||
struct DoubleLinkNode* prior, * next;
|
||||
} DoubleLinkNode, *DoubleLinkList;
|
||||
|
||||
|
||||
// 初始化有头节点双链表
|
||||
int InitDoubleLinkListWithHead(DoubleLinkList list) {
|
||||
list = (DoubleLinkNode*)malloc(sizeof(DoubleLinkNode));
|
||||
// 分配内存失败
|
||||
if (list == NULL) {
|
||||
printf("InitDoubleLinkListWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
// 头结点的前驱结点始终为NULL
|
||||
list->prior = NULL;
|
||||
list->next = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 判断有头节点双链表是否为空
|
||||
int IsDoubleLinkListEmptyWithHead(DoubleLinkList list) {
|
||||
if (list->next == NULL) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 后插入双链表元素
|
||||
int InsertNextDoubleLinkNode(DoubleLinkNode* node, element_type elem) {
|
||||
if (node == NULL) {
|
||||
printf("InsertNextDoubleLinkNode:插入结点为空!");
|
||||
return 1;
|
||||
}
|
||||
DoubleLinkNode* s = (DoubleLinkNode*)malloc(sizeof(DoubleLinkNode));
|
||||
// 如果分配空间失败
|
||||
if (s == NULL) {
|
||||
printf("InsertNextDoubleLinkNode:分配内存失败!\n");
|
||||
return 1;
|
||||
}
|
||||
s->data = elem;
|
||||
// 将新建结点s插入结点node后
|
||||
s->next = node->next;
|
||||
// 如果有后继结点,将p原来的后继给s结点
|
||||
if (node->next->prior) {
|
||||
node->next->prior = s;
|
||||
}
|
||||
// 交换s的前驱和后继
|
||||
s->prior = node;
|
||||
node->next = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 前插入双链表元素
|
||||
int InsertPriorDoubleLinkNode(DoubleLinkNode* node, element_type elem) {
|
||||
if (node == NULL) {
|
||||
printf("InsertPriorDoubleLinkNode:插入结点为空!");
|
||||
return 1;
|
||||
}
|
||||
DoubleLinkNode* s = (DoubleLinkNode*)malloc(sizeof(DoubleLinkNode));
|
||||
// 如果分配空间失败
|
||||
if (s == NULL) {
|
||||
printf("InsertPriorDoubleLinkNode:分配内存失败!\n");
|
||||
return 1;
|
||||
}
|
||||
s->next = node->next;
|
||||
node->next = s;
|
||||
s->data = node->data;
|
||||
node->data = elem;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 删除双链表后续结点
|
||||
int DeleteNextDoubleLinkListNode(DoubleLinkNode* node) {
|
||||
if (node == NULL) {
|
||||
printf("DeleteDoubleLinkListNode:删除结点为空!");
|
||||
return 1;
|
||||
}
|
||||
DoubleLinkNode* p = node->next;
|
||||
if (p == NULL) {
|
||||
printf("DeleteDoubleLinkListNode:删除结点后续结点为空!");
|
||||
return 1;
|
||||
}
|
||||
node->next = p->next;
|
||||
// 如果p结点为最后一个结点
|
||||
if (p->next != NULL) {
|
||||
p->next->prior = node;
|
||||
}
|
||||
free(p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 销毁双链表
|
||||
int DestroyDoubleLinkList(DoubleLinkList list) {
|
||||
// 循环删除各个结点
|
||||
while (list->next != NULL) {
|
||||
DeleteNextDoubleLinkListNode(list);
|
||||
}
|
||||
// 释放头结点
|
||||
free(list);
|
||||
list = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 初始化有头节点循环双链表
|
||||
int InitCircularDoubleLinkListWithHead(DoubleLinkList list) {
|
||||
list = (DoubleLinkNode*)malloc(sizeof(DoubleLinkNode));
|
||||
if (list == NULL) {
|
||||
printf("InitCircularDoubleLinkListWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
// 前后指针都指向其本身
|
||||
list->next = list;
|
||||
list->prior = list;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 判断有头节点循环双链表是否为空
|
||||
int IsCircularDoubleLinkListEmptyWithHead(DoubleLinkList list) {
|
||||
if (list->next == list) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 判断结点是否尾有头节点循环双链表的尾结点
|
||||
int IsCircularDoubleLinkListEndWithHead(DoubleLinkList list, DoubleLinkNode* node) {
|
||||
if (node->next == list) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 后插入循环双链表元素
|
||||
// 与双链表一样,唯一区别就是不用判别后一个元素是否为NULL,因为是连接在一起的
|
||||
int InsertNextCircularDoubleLinkNode(DoubleLinkNode* node, element_type elem) {
|
||||
if (node == NULL) {
|
||||
printf("InsertNextDoubleLinkNode:插入结点为空!");
|
||||
return 1;
|
||||
}
|
||||
DoubleLinkNode* s = (DoubleLinkNode*)malloc(sizeof(DoubleLinkNode));
|
||||
// 如果分配空间失败
|
||||
if (s == NULL) {
|
||||
printf("InsertNextDoubleLinkNode:分配内存失败!\n");
|
||||
return 1;
|
||||
}
|
||||
s->data = elem;
|
||||
// 将新建结点s插入结点node后
|
||||
s->next = node->next;
|
||||
// 不同之处,一定有后继结点,将p原来的后继给s结点
|
||||
node->next->prior = s;
|
||||
// 交换s的前驱和后继
|
||||
s->prior = node;
|
||||
node->next = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 删除循环双链表后续结点
|
||||
// 与双链表一样,唯一区别就是不用判别后一个元素是否为NULL,因为是连接在一起的
|
||||
int DeleteNextCircularDoubleLinkListNode(DoubleLinkNode* node) {
|
||||
if (node == NULL) {
|
||||
printf("DeleteDoubleLinkListNode:删除结点为空!");
|
||||
return 1;
|
||||
}
|
||||
DoubleLinkNode* p = node->next;
|
||||
if (p == NULL) {
|
||||
printf("DeleteDoubleLinkListNode:删除结点后续结点为空!");
|
||||
return 1;
|
||||
}
|
||||
node->next = p->next;
|
||||
// 不同之处
|
||||
p->next->prior = node;
|
||||
free(p);
|
||||
return 0;
|
||||
}
|
||||
@@ -2,8 +2,8 @@
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 链表结点
|
||||
typedef struct {
|
||||
// 单链表结点
|
||||
typedef struct LinkNode {
|
||||
element_type data;
|
||||
struct LinkNode* next;
|
||||
} LinkNode, *LinkList;
|
||||
@@ -12,6 +12,7 @@ typedef struct {
|
||||
int InitLinkListWithHead(LinkList list) {
|
||||
list = (LinkNode*)malloc(sizeof(LinkNode));
|
||||
if (list == NULL) {
|
||||
printf("InitLinkListWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
list->next = NULL;
|
||||
@@ -25,7 +26,7 @@ int InitLinkListWithoutHead(LinkList list) {
|
||||
}
|
||||
|
||||
// 判断有头节点单链表是否为空
|
||||
int IsLLinkListEmptyWithHead(LinkList list) {
|
||||
int IsLinkListEmptyWithHead(LinkList list) {
|
||||
if (list->next == NULL) {
|
||||
return 1;
|
||||
}
|
||||
@@ -128,6 +129,7 @@ int InsertLinkListWithoutHead(LinkList list, int index, element_type elem) {
|
||||
// 后插入单链表元素
|
||||
int InsertNextLinkNode(LinkNode* node, element_type elem) {
|
||||
if (node == NULL) {
|
||||
printf("InsertNextLinkNode:插入结点为空!");
|
||||
return 1;
|
||||
}
|
||||
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
|
||||
@@ -145,6 +147,7 @@ int InsertNextLinkNode(LinkNode* node, element_type elem) {
|
||||
// 前插入单链表元素
|
||||
int InsertPriorLinkNode(LinkNode* node, element_type elem) {
|
||||
if (node == NULL) {
|
||||
printf("InsertPriorLinkNode:插入结点为空!");
|
||||
return 1;
|
||||
}
|
||||
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
|
||||
@@ -321,7 +324,7 @@ int GetLength(LinkList list) {
|
||||
}
|
||||
|
||||
// 后插建立带头节点单链表
|
||||
LinkList TailBuildLinkListWithHead(LinkList* list, int length) {
|
||||
LinkList TailBuildLinkListWithHead(LinkList list, int length) {
|
||||
element_type elem;
|
||||
list = (LinkList)malloc(sizeof(LinkNode));
|
||||
// s指针为一个中间变量指针,r指针为尾指针(next指向最后一个元素)
|
||||
@@ -340,4 +343,62 @@ LinkList TailBuildLinkListWithHead(LinkList* list, int length) {
|
||||
r = s;
|
||||
i++;
|
||||
}
|
||||
r->next = NULL;
|
||||
return list;
|
||||
}
|
||||
|
||||
// 前插建立带头节点单链表
|
||||
LinkList HeadBuildLinkListWithHead(LinkList list, int length) {
|
||||
element_type elem;
|
||||
list = (LinkList)malloc(sizeof(LinkNode));
|
||||
// 将单链表尾部设置为NULL
|
||||
list->next = NULL;
|
||||
// s指针为一个中间变量指针
|
||||
LinkNode* s;
|
||||
int i = 0;
|
||||
element_type x;
|
||||
if (length < 1) {
|
||||
printf("HeadBuildLinkListWithHead:输入的单链表长度过小!");
|
||||
return 1;
|
||||
}
|
||||
while (i < length) {
|
||||
scanf("%d", &x);
|
||||
s = (LinkNode*)malloc(sizeof(LinkNode));
|
||||
s->data = x;
|
||||
s->next = list->next;
|
||||
list->next = s;
|
||||
i++;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
// 初始化有头节点循环单链表
|
||||
int InitCircularLinkListWithHead(LinkList list) {
|
||||
list = (LinkNode*)malloc(sizeof(LinkNode));
|
||||
if (list == NULL) {
|
||||
printf("InitCircularLinkListWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
list->next = list;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 判断有头节点循环单链表是否为空
|
||||
int IsCircularLinkListEmptyWithHead(LinkList list) {
|
||||
if (list->next == list) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 判断结点是否尾有头节点循环单链表的尾结点
|
||||
int IsCircularLinkListEndWithHead(LinkList list, LinkNode* node) {
|
||||
if (node->next == list) {
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
10
Code/static_link_list.h
Normal file
10
Code/static_link_list.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "head.h"
|
||||
|
||||
// 静态链表结点
|
||||
typedef struct StaticLinkNode {
|
||||
element_type data;
|
||||
// 下一个元素的数组下标
|
||||
int next;
|
||||
} DoubleLinkNode, * DoubleLinkList;
|
||||
Reference in New Issue
Block a user