mirror of
https://github.com/Didnelpsun/CS408.git
synced 2026-02-11 14:45:57 +08:00
更新链表
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
*.pdf
|
||||
/Code/.vs/
|
||||
/Code/Debug/
|
||||
/Code/x64/
|
||||
@@ -116,6 +116,7 @@
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<BasicRuntimeChecks>UninitializedLocalUsageCheck</BasicRuntimeChecks>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// 初始化最大长度
|
||||
#define MAXSIZE 5
|
||||
// 定义默认值
|
||||
#define DEFAULTELEM 0
|
||||
#define DEFAULTELEM '0'
|
||||
// 定义最大值
|
||||
#define INFINITY 32767
|
||||
// 定义默认数据类型
|
||||
|
||||
@@ -15,6 +15,7 @@ int InitLinkListWithHead(LinkList list) {
|
||||
printf("InitLinkListWithHead:初始化分配内存失败!");
|
||||
return 1;
|
||||
}
|
||||
list->data = NULL;
|
||||
list->next = NULL;
|
||||
return 0;
|
||||
}
|
||||
@@ -26,7 +27,7 @@ int InitLinkListWithoutHead(LinkList list) {
|
||||
}
|
||||
|
||||
// 判断有头节点单链表是否为空
|
||||
int IsLinkListEmptyWithHead(LinkList list) {
|
||||
int EmptyLinkListWithHead(LinkList list) {
|
||||
if (list->next == NULL) {
|
||||
return 1;
|
||||
}
|
||||
@@ -36,7 +37,7 @@ int IsLinkListEmptyWithHead(LinkList list) {
|
||||
}
|
||||
|
||||
// 判断无头节点单链表是否为空
|
||||
int IsLLinkListEmptyWithoutHead(LinkList list) {
|
||||
int EmptyIsLLinkListWithoutHead(LinkList list) {
|
||||
if (list == NULL) {
|
||||
return 1;
|
||||
}
|
||||
@@ -46,6 +47,7 @@ int IsLLinkListEmptyWithoutHead(LinkList list) {
|
||||
}
|
||||
|
||||
// 插入有头节点单链表元素
|
||||
// 0号节点是头节点
|
||||
int InsertLinkListWithHead(LinkList list, int index, element_type elem) {
|
||||
if (index < 1) {
|
||||
printf("InsertLinkListWithHead:插入索引值过小!\n");
|
||||
@@ -194,7 +196,7 @@ int DeleteLinkListWithHead(LinkList list, int index, element_type *elem) {
|
||||
}
|
||||
|
||||
// 删除无头节点单链表元素
|
||||
int DeleteLinkListWithHead(LinkList list, int index, element_type* elem) {
|
||||
int DeleteLinkListWithoutHead(LinkList list, int index, element_type* elem) {
|
||||
if (index < 0) {
|
||||
printf("DeleteLinkListWithHead:删除索引值过小!\n");
|
||||
return 1;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
int main()
|
||||
{
|
||||
SequenceListTest();
|
||||
//SequenceListTest();
|
||||
//LinkListTest();
|
||||
return 0;
|
||||
}
|
||||
@@ -225,16 +225,11 @@ int MultiDeleteStaticSequenceList(StaticSequenceList* list, int index, int len,
|
||||
printf("MultiDeleteStaticSequenceList:删除索引超过索引范围!\n");
|
||||
return 1;
|
||||
}
|
||||
elem = (element_type*)malloc(len * sizeof(element_type));
|
||||
if (elem == NULL) {
|
||||
printf("MultiDeleteStaticSequenceList:分配空间失败!\n");
|
||||
}
|
||||
else {
|
||||
for (int i = index; i < list->length - len; i++) {
|
||||
for (int i = index; i < list->length - len; i++) {
|
||||
if (i < index + len) {
|
||||
elem[i - index] = list->data[i];
|
||||
list->data[i] = list->data[i + len];
|
||||
}
|
||||
list->length -= len;
|
||||
list->data[i] = list->data[i + len];
|
||||
}
|
||||
list->length -= len;
|
||||
return 0;
|
||||
@@ -246,17 +241,13 @@ int MultiDeleteDynamicSequenceList(DynamicSequenceList* list, int index, int len
|
||||
printf("MultiDeleteDynamicSequenceList:删除索引超过索引范围!\n");
|
||||
return 1;
|
||||
}
|
||||
elem = (element_type*)malloc(len * sizeof(element_type));
|
||||
if (elem == NULL) {
|
||||
printf("MultiDeleteDynamicSequenceList:分配空间失败!\n");
|
||||
}
|
||||
else {
|
||||
for (int i = index; i < list->length - len; i++) {
|
||||
for (int i = index; i < list->length - len; i++) {
|
||||
if (i < index + len) {
|
||||
elem[i - index] = list->data[i];
|
||||
list->data[i] = list->data[i + len];
|
||||
}
|
||||
list->length -= len;
|
||||
list->data[i] = list->data[i + len];
|
||||
}
|
||||
list->length -= len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -264,7 +255,7 @@ int MultiDeleteDynamicSequenceList(DynamicSequenceList* list, int index, int len
|
||||
element_type GetStaticSequenceListElement(StaticSequenceList list, int index) {
|
||||
if (index >= list.length || index < 0) {
|
||||
printf("GetStaticSequenceListElement:查找索引超过索引范围!\n");
|
||||
return NULL;
|
||||
return DEFAULTELEM;
|
||||
}
|
||||
return list.data[index];
|
||||
}
|
||||
@@ -273,7 +264,7 @@ element_type GetStaticSequenceListElement(StaticSequenceList list, int index) {
|
||||
element_type GetDynamicSequenceListElement(DynamicSequenceList list, int index) {
|
||||
if (index >= list.length || index < 0) {
|
||||
printf("GetDynamicSequenceListElement:查找索引超过索引范围!\n");
|
||||
return NULL;
|
||||
return DEFAULTELEM;
|
||||
}
|
||||
return list.data[index];
|
||||
}
|
||||
@@ -322,6 +313,10 @@ int EmptyDynamicSequenceList(DynamicSequenceList list) {
|
||||
|
||||
// 销毁动态顺序表
|
||||
int DestroyDynamicSequenceList(DynamicSequenceList* list) {
|
||||
free(list);
|
||||
if (list != NULL) {
|
||||
free(list->data);
|
||||
}
|
||||
list = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
21
Code/test.c
21
Code/test.c
@@ -1,7 +1,7 @@
|
||||
// ²âÊÔÎļþ
|
||||
|
||||
#include "head.h"
|
||||
#include "sequence_list.h"
|
||||
#include "link_list.h"
|
||||
|
||||
int SequenceListTest() {
|
||||
DynamicSequenceList list;
|
||||
@@ -13,15 +13,28 @@ int SequenceListTest() {
|
||||
//printf("%d", list.length);
|
||||
PrintfDynamicSequenceList(list);
|
||||
printf("\n");
|
||||
element_type elem;
|
||||
MultiDeleteDynamicSequenceList(&list, 2, 2, &elem);
|
||||
int len = 2;
|
||||
element_type elem[2];
|
||||
MultiDeleteDynamicSequenceList(&list, 0, len, elem);
|
||||
PrintfDynamicSequenceList(list);
|
||||
for (int i = 0; i < len; i++) {
|
||||
printf("%c\n", elem[i]);
|
||||
}
|
||||
/*DynamicSequenceList dlist;
|
||||
InitDynamicSequenceList(&dlist);
|
||||
OtherIncreaseDynamicSequenceList(&dlist, 15);
|
||||
printf("%d", dlist.max_size);*/
|
||||
int index = LocateDynamicSequenceListElement(list, '5');
|
||||
/*int index = LocateDynamicSequenceListElement(list, '5');
|
||||
printf("%d", index);
|
||||
DestroyDynamicSequenceList(&list);*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
int LinkListTest() {
|
||||
//LinkList list;
|
||||
//InitLinkListWithHead(list);
|
||||
//int empty = EmptyLinkListWithHead(list);
|
||||
//printf("%d", empty);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ typedef struct {
|
||||
|
||||
每个结点只包含一个指针域,也称为线性链表。
|
||||
|
||||
通常用头指针来标识一个单链表,如单链表L。
|
||||
通常用头指针来标识一个单链表,如单链表$L$。
|
||||
|
||||
### 单链表特点
|
||||
|
||||
@@ -116,9 +116,19 @@ typedef struct {
|
||||
+ 不可随机存取。
|
||||
+ 要花费多余空间存放指针。
|
||||
|
||||
是非随机存取的存储结构。
|
||||
|
||||
### 单链表定义
|
||||
|
||||
使用LinkNode表示一个单链表结点的结构体,而使用LinkList表示一个单链表,其实LinkList是一个指向LinkNode的指针变量。如定义LinkList L等价于LinkNode* L。
|
||||
使用`LinkNode`表示一个单链表结点的结构体,而使用`LinkList`表示一个单链表,其实`LinkList`是一个指向`LinkNode`的指针变量。如定义`LinkList L`等价于`LinkNode* L`。
|
||||
|
||||
```c
|
||||
// 单链表结点
|
||||
typedef struct LinkListNode {
|
||||
element_type data;
|
||||
struct LinkListNode* next;
|
||||
} LinkListNode, *LinkList;
|
||||
```
|
||||
|
||||
### 单链表操作
|
||||
|
||||
@@ -126,6 +136,9 @@ typedef struct {
|
||||
|
||||
有带头节点与不带头节点的初始化的区别,带头节点代表第一个结点不存放数据,只是用于标识单链表的开始,但是区别不大,带头结点更好使用。
|
||||
|
||||
+ 由于第一个数据结点的位置被存放在头结点的指针域中,因此在链表的第一个位置上的操作和在表的其他位置上的操作一致,无须进行特殊处理。
|
||||
+ 无论链表是否为空,其头指针都指向头结点的非空指针(空表中头结点的指针域为空),因此空表和非空表的处理也就得到了统一。
|
||||
|
||||
#### 单链表插入
|
||||
|
||||
插入方式一共分为下面几种:
|
||||
|
||||
2
Operate-System/0-summary-ex.md
Normal file
2
Operate-System/0-summary-ex.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# 概述习题
|
||||
|
||||
Reference in New Issue
Block a user