c语言找出单向链表的中间结点并统计全部节点数
时间: 2024-05-12 20:18:10 浏览: 9
好的,这是一道关于单向链表的中间节点问题,需要遍历链表并记录节点数量。下面是代码示例:
```
typedef struct Node {
int data;
struct Node* next;
} Node;
// 找到单向链表的中间节点并统计节点数
void findMid(Node* head, int* count, int* mid) {
Node* slow = head;
Node* fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
(*count)++;
}
*mid = slow->data;
}
```
在上面的代码中,我们使用了两个指针 `slow` 和 `fast`,`slow` 指针每次移动一个节点,`fast` 指针每次移动两个节点。当 `fast` 指针到达链表末尾时,`slow` 指针正好指向链表的中间节点。我们使用一个变量 `count` 统计链表的节点数量,最终将链表的中间节点的值存储在变量 `mid` 中。
请注意,以上代码仅展示了如何处理单向链表的中间节点问题,对于其他的问题场景,需要根据不同的具体需求进行相应的修改和调整。
相关问题
用C语言写出单向链表查找节点的算法
以下是用 C 语言实现单向链表查找节点的算法示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode *next;
};
// 查找链表中第一个值为 val 的节点,返回该节点的指针,如果不存在则返回 NULL
struct ListNode* findNode(struct ListNode* head, int val) {
// 遍历链表
while (head != NULL) {
// 如果当前节点的值为 val,则返回该节点的指针
if (head->val == val) {
return head;
}
// 否则,继续遍历下一个节点
head = head->next;
}
// 链表中不存在值为 val 的节点,返回 NULL
return NULL;
}
int main() {
// 创建链表的头结点
struct ListNode* head = (struct ListNode*) malloc(sizeof(struct ListNode));
head->val = 1;
head->next = NULL;
// 添加新节点
struct ListNode* node1 = (struct ListNode*) malloc(sizeof(struct ListNode));
node1->val = 2;
node1->next = NULL;
head->next = node1;
// 添加新节点
struct ListNode* node2 = (struct ListNode*) malloc(sizeof(struct ListNode));
node2->val = 3;
node2->next = NULL;
node1->next = node2;
// 查找链表中值为 2 的节点
struct ListNode* node = findNode(head, 2);
if (node != NULL) {
printf("找到了节点,节点的值为 %d\n", node->val);
} else {
printf("未找到节点\n");
}
// 释放链表节点的内存
free(node1);
free(node2);
free(head);
return 0;
}
```
C语言实现单向链表的创建及数据的删除
单向链表是一种常用的数据结构,它由多个节点组成,每个节点包含一个数据和一个指向下一个节点的指针。本文将介绍如何使用C语言实现单向链表的创建和数据的删除。
1. 创建单向链表
创建单向链表需要定义一个节点结构体,包含数据成员和指向下一个节点的指针。然后通过循环动态分配节点内存并将节点按顺序连接起来,最后返回链表头节点的指针。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
struct Node* createLinkedList(int n) {
struct Node *head = NULL, *tail = NULL;
int i, data;
for (i = 1; i <= n; i++) {
printf("Enter node %d data: ", i);
scanf("%d", &data);
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
int main() {
int n;
printf("Enter the number of nodes: ");
scanf("%d", &n);
struct Node *head = createLinkedList(n);
return 0;
}
```
在上面的代码中,createLinkedList()函数用于创建单向链表,其中n表示链表的长度。该函数首先定义head和tail指针,分别指向链表的头结点和尾节点。然后循环n次,每次从键盘输入一个数据,动态分配一个新节点内存,并将新节点连接到链表尾部。最后返回头节点的指针。
2. 删除单向链表中的数据
删除单向链表中的数据需要先找到要删除的节点,然后将该节点从链表中断开,并释放节点内存。可以定义一个函数deleteNode()实现这个过程。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
struct Node* createLinkedList(int n) {
struct Node *head = NULL, *tail = NULL;
int i, data;
for (i = 1; i <= n; i++) {
printf("Enter node %d data: ", i);
scanf("%d", &data);
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
void deleteNode(struct Node **head, int key) {
struct Node *prev = NULL, *curr = *head;
while (curr != NULL && curr->data != key) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("Node with key %d not found\n", key);
return;
}
if (prev == NULL) {
*head = curr->next;
} else {
prev->next = curr->next;
}
printf("Node with key %d deleted\n", key);
free(curr);
}
int main() {
int n, key;
printf("Enter the number of nodes: ");
scanf("%d", &n);
struct Node *head = createLinkedList(n);
printf("Enter a node key to delete: ");
scanf("%d", &key);
deleteNode(&head, key);
return 0;
}
```
在上面的代码中,deleteNode()函数用于删除单向链表中的数据。该函数首先定义两个指针prev和curr,分别指向当前节点的前一个节点和当前节点。然后循环链表,直到找到要删除的节点或链表遍历完毕。如果找到了要删除的节点,就将该节点从链表中断开,并释放节点内存。如果要删除的节点是头节点,就将head指针指向下一个节点,否则就将前一个节点的next指针指向下一个节点。
总结
本文介绍了如何使用C语言实现单向链表的创建和数据的删除。在实际应用中,单向链表是一种非常常用的数据结构,具有插入和删除节点操作效率高、空间利用率高等优点。因此,熟练掌握单向链表的实现方法对于提高程序员的编程水平和解决实际问题非常有帮助。