本文将详细讲解如何使用C语言操作链表,主要内容包括链表的定义、创建、插入、删除、查找、遍历等示例操作。
链表的定义
链表是一种常见的数据结构,它由一系列的节点(结构体)组成,每个节点包含数据域和指向下一个节点的指针域。链表的结构体定义如下:
typedef struct node {
int data; // 数据域
struct node* next; // 指针域
} ListNode;
链表的头节点是第一个非数据节点,也称为哨兵节点。它的数据域可以为空,指针域指向第一个数据节点。
ListNode* head = NULL;
链表的创建
链表的创建可以分为两种方式:头插法和尾插法。以头插法为例,其步骤如下:
- 定义一个头节点,指针域为NULL。
- 读入一个节点数据,创建一个新节点,将新节点的指针域指向头节点的指针域,将头节点的指针域指向新节点。
- 重复第2步,直到读入所有节点数据为止。
示例代码如下:
ListNode* createList() {
ListNode* head = (ListNode*)malloc(sizeof(ListNode)); // 创建头节点
head->next = NULL; // 空链表只有头节点,指针域为NULL
int data;
ListNode* newNode;
while (scanf("%d", &data) != EOF) { // 读入节点数据
newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
newNode->data = data;
newNode->next = head->next; // 将新节点的指针域指向头节点的指针域
head->next = newNode; // 将头节点的指针域指向新节点
}
return head;
}
链表的插入
链表的插入可以分为三种方式:头插法、尾插法和在指定位置插入。以在指定位置插入为例,其步骤如下:
- 找到要插入位置的前一个节点。
- 创建一个新节点,将新节点的指针域指向前一个节点的指针域,将前一个节点的指针域指向新节点。
示例代码如下:
void insertNode(ListNode* head, int pos, int data) {
ListNode* p = head;
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点
newNode->data = data;
newNode->next = NULL;
for (int i = 0; i < pos && p != NULL; i++) { // 找到要插入位置的前一个节点
p = p->next;
}
if (p == NULL) {
printf("插入位置非法\n");
return;
}
newNode->next = p->next; // 将新节点的指针域指向前一个节点的指针域
p->next = newNode;
}
链表的删除
链表的删除同样可以根据需求分为三种方式:删除头节点、删除尾节点和删除指定位置。以删除指定位置为例,其步骤如下:
- 找到要删除位置的前一个节点,记为p。
- 将p的指针指向要删除节点的下一个节点。
示例代码如下:
void deleteNode(ListNode* head, int pos) {
ListNode* p = head;
ListNode* tmp;
for (int i = 0; i < pos && p != NULL; i++) { // 找到要删除位置的前一个节点
p = p->next;
}
if (p == NULL || p->next == NULL) { // 如果p为空或p的下一个节点为空,则删除位置非法
printf("删除位置非法\n");
return;
}
tmp = p->next; // 将p的指针指向要删除节点的下一个节点
p->next = tmp->next;
free(tmp); // 释放要删除节点的内存空间
}
链表的查找
链表的查找比较简单,只需要从头节点开始依次遍历每个节点即可。以查找指定元素为例,其步骤如下:
- 从头节点开始遍历每个节点,比较每个节点的数据域是否等于要查找的元素。
- 如果相等,则返回该节点的指针;否则返回NULL。
示例代码如下:
ListNode* searchNode(ListNode* head, int target) {
ListNode* p = head->next; // 从头节点开始遍历每个节点
while (p != NULL) {
if (p->data == target) { // 比较每个节点的数据域是否等于要查找的元素
return p; // 返回该节点的指针
}
p = p->next;
}
return NULL; // 没找到,返回NULL
}
链表的遍历
链表的遍历也比较容易,只需要从头节点开始依次遍历每个节点,输出每个节点的数据域即可。
示例代码如下:
void printList(ListNode* head) {
ListNode* p = head->next; // 从头节点开始遍历每个节点
while (p != NULL) {
printf("%d ", p->data); // 输出每个节点的数据域
p = p->next;
}
printf("\n");
}
以上就是C语言链表操作的完整攻略,分别介绍了链表的定义、创建、插入、删除、查找和遍历,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言链表操作示例分享 - Python技术站