当前位置:实例文章 » 其他实例» [文章]王道考研数据结构第三章知识点总结

王道考研数据结构第三章知识点总结

发布人:shili8 发布时间:2025-02-25 06:48 阅读次数:0

**王道考研数据结构第三章知识点总结**

第三章是《王道考研数据结构》中的一个重要部分,涵盖了线性表的基本概念、线性表的存储方式以及线性表的运算。下面我们将对这些内容进行详细的总结和分析。

**3.1 线性表的基本概念**

线性表是指元素之间存在一一对应关系的数据结构,通常表现为一个序列或链条。线性表可以分为两类:顺序存储和链式存储。

* **顺序存储**:在内存中连续地存放线性表中的所有元素。
* **链式存储**:每个元素的地址不一定相邻,通过指针来连接各个元素。

**3.2 线性表的存储方式**

线性表有两种基本的存储方式:顺序存储和链式存储。

###3.2.1 顺序存储在内存中连续地存放线性表中的所有元素。这种存储方式通常使用数组来实现。

c// 顺序存储的线性表示例typedef struct {
 int data[10]; // 存储数据 int length; // 表长} SeqList;

int main() {
 SeqList list;
 list.length =5;
 for (int i =0; i < list.length; i++) {
 scanf("%d", &list.data[i]);
 }
 printf("线性表元素:");
 for (int i =0; i < list.length; i++) {
 printf("%d ", list.data[i]);
 }
 return0;
}


###3.2.2 链式存储每个元素的地址不一定相邻,通过指针来连接各个元素。这种存储方式通常使用链表来实现。

c// 链式存储的线性表示例typedef struct Node {
 int data; // 存储数据 struct Node* next; // 指向下一个结点的指针} Node;

typedef struct {
 Node* head; // 头结点 Node* tail; // 尾结点 int length; // 表长} LinkList;

int main() {
 LinkList list;
 list.length =5;
 for (int i =0; i < list.length; i++) {
 Node node;
 scanf("%d", &node.data);
 if (list.head == NULL) {
 list.head = &node;
 list.tail = &node;
 } else {
 list.tail->next = &node;
 list.tail = &node;
 }
 }
 printf("线性表元素:");
 Node* p = list.head;
 while (p != NULL) {
 printf("%d ", p->data);
 p = p->next;
 }
 return0;
}


**3.3 线性表的运算**

线性表支持以下基本运算:

* **插入**:在指定位置插入一个新元素。
* **删除**:从指定位置删除一个元素。
* **查找**:找到指定元素的位置。
* **排序**:对线性表进行排序。

这些运算可以分别使用顺序存储和链式存储来实现。下面我们将对这些内容进行详细的总结和分析。

###3.3.1 插入插入是指在指定位置插入一个新元素。这种操作需要考虑到线性表的存储方式。

#### 顺序存储在顺序存储中,插入可以使用数组的索引来实现。

c// 顺序存储中的插入示例void insert(SeqList* list, int index, int data) {
 if (index < 0 || index > list->length) {
 printf("错误:索引越界。
");
 return;
 }
 for (int i = list->length; i > index; i--) {
 list->data[i] = list->data[i -1];
 }
 list->data[index] = data;
 list->length++;
}


#### 链式存储在链式存储中,插入需要考虑到新元素的位置和指针的更新。

c// 链式存储中的插入示例void insert(LinkList* list, int index, int data) {
 Node node;
 node.data = data;
 if (index ==0) {
 node.next = list->head;
 list->head = &node;
 } else if (index == list->length) {
 list->tail->next = &node;
 list->tail = &node;
 } else {
 Node* p = list->head;
 for (int i =0; i < index -1; i++) {
 p = p->next;
 }
 node.next = p->next;
 p->next = &node;
 }
 list->length++;
}


###3.3.2 删除删除是指从指定位置删除一个元素。这种操作需要考虑到线性表的存储方式。

#### 顺序存储在顺序存储中,删除可以使用数组的索引来实现。

c// 顺序存储中的删除示例void delete(SeqList* list, int index) {
 if (index < 0 || index >= list->length) {
 printf("错误:索引越界。
");
 return;
 }
 for (int i = index; i < list->length -1; i++) {
 list->data[i] = list->data[i +1];
 }
 list->length--;
}


#### 链式存储在链式存储中,删除需要考虑到被删除元素的位置和指针的更新。

c// 链式存储中的删除示例void delete(LinkList* list, int index) {
 if (index ==0) {
 Node* p = list->head;
 list->head = p->next;
 free(p);
 } else if (index == list->length -1) {
 Node* p = list->tail;
 list->tail = p->prev;
 list->tail->next = NULL;
 free(p);
 } else {
 Node* p = list->head;
 for (int i =0; i < index -1; i++) {
 p = p->next;
 }
 Node* q = p->next;
 p->next = q->next;
 free(q);
 }
 list->length--;
}


###3.3.3 查找查找是指找到指定元素的位置。这种操作需要考虑到线性表的存储方式。

#### 顺序存储在顺序存储中,查找可以使用数组的索引来实现。

c// 顺序存储中的查找示例int find(SeqList* list, int data) {
 for (int i =0; i < list->length; i++) {
 if (list->data[i] == data) {
 return i;
 }
 }
 return -1;
}


#### 链式存储在链式存储中,查找需要考虑到元素的位置和指针的更新。

c// 链式存储中的查找示例int find(LinkList* list, int data) {
 Node* p = list->head;
 while (p != NULL) {
 if (p->data == data) {
 return0; // 找到元素,返回位置 }
 p = p->next;
 }
 return -1; // 未找到元素,返回-1}


###3.3.4 排序排序是指对线性表进行排序。这种操作需要考虑到线性表的存储方式。

#### 顺序存储在顺序存储中,排序可以使用数组的索引来实现。

c// 顺序存储中的排序示例void sort(SeqList* list) {
 for (int i =0; i < list->length -1; i++) {
 for (int j =0; j < list->length - i -1; j++) {
 if (list->data[j] > list->data[j +1]) {
 int temp = list->data[j];
 list->data[j] = list->data[j +1];
 list->data[j +1] = temp;
 }
 }
 }
}


#### 链式存储在链式存储中,排序需要考虑到元素的位置和指针的更新。

c// 链式存储中的排序示例void sort(LinkList* list) {
 Node* p = list->head;
 while (p

相关标签:算法数据结构
其他信息

其他资源

Top