C语言编写一个单向循环链表
时间: 2023-03-19 17:25:11 浏览: 103
我可以给您一些建议去编写一个单向循环链表:1. 定义一个结构体,其中包含一个指向下一个节点的指针以及相关的数据;2. 创建一个指向首节点的指针;3. 创建一个新的节点,为其分配内存;4. 为新节点赋值;5. 将当前节点的指针指向新创建的节点;6. 将新节点的指针指向首节点,以完成循环链表;7. 重复步骤3-6以追加更多节点。
相关问题
用C语言编写一个函数,以一个单向链表的头指针做参数,函数返回值是这个链表的节点个数
以下是用C语言编写的函数,可以用于计算单向链表的节点个数:
```c
#include <stdio.h>
#include <stdlib.h>
//定义链表结构体
struct Node {
int data;
struct Node* next;
};
//定义计算链表节点个数的函数
int countNodes(struct Node* head) {
int count = 0; //计数器
struct Node* current = head; //指向当前节点的指针
//遍历链表
while (current != NULL) {
count++; //节点个数加1
current = current->next; //指向下一个节点
}
return count; //返回节点个数
}
int main() {
//创建链表
struct Node* head = NULL;
struct Node* second = NULL;
struct Node* third = NULL;
head = (struct Node*)malloc(sizeof(struct Node));
second = (struct Node*)malloc(sizeof(struct Node));
third = (struct Node*)malloc(sizeof(struct Node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
//调用计算链表节点个数的函数
int nodeCount = countNodes(head);
printf("链表节点个数为:%d\n", nodeCount);
return 0;
}
```
这个程序中,我们首先定义了一个链表结构体 `Node`,其中包含两个成员变量 `data` 和 `next`。`data` 表示节点中存储的数据,`next` 是一个指向下一个节点的指针。
接着,我们定义了一个计算链表节点个数的函数 `countNodes`,该函数的参数是链表的头指针 `head`。在函数中,我们定义了一个计数器 `count` 和一个指向当前节点的指针 `current`。我们使用 `while` 循环遍历链表,在每次循环中将计数器加1,同时将指针指向下一个节点。最后,函数返回计数器的值,即链表的节点个数。
在 `main` 函数中,我们创建了一个包含三个节点的链表,并调用了 `countNodes` 函数来计算节点个数。最终程序输出了链表节点的个数。
约瑟夫问题C语言单向链表实现
约瑟夫问题是一个经典的数学问题,它的具体描述是:有n个人围成一圈,从第k个人开始报数,报到m的人出列,然后从下一个人开始重新报数,直到所有人都出列。现在我来介绍一下如何使用C语言的单向链表来实现约瑟夫问题。
首先,我们需要定义一个链表节点的结构体,包含两个成员变量:一个是保存人员编号的整型变量,另一个是指向下一个节点的指针。
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
接下来,我们可以编写一个函数来创建一个包含n个节点的循环链表,并返回链表的头节点。
```c
Node* createCircularLinkedList(int n) {
Node* head = NULL;
Node* prev = NULL;
for (int i = 1; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
if (head == NULL) {
head = newNode;
} else {
prev->next = newNode;
}
prev = newNode;
}
prev->next = head; // 将最后一个节点的next指针指向头节点,形成循环链表
return head;
}
```
接下来,我们可以编写一个函数来模拟约瑟夫问题的求解过程。
```c
void josephusProblem(Node* head, int k, int m) {
Node* current = head;
Node* prev = NULL;
// 找到从第k个人开始报数的节点
for (int i = 1; i < k; i++) {
prev = current;
current = current->next;
}
// 开始报数并出列,直到所有人都出列
while (current->next != current) {
// 报数m次
for (int i = 1; i < m; i++) {
prev = current;
current = current->next;
}
// 出列
prev->next = current->next;
Node* temp = current;
current = current->next;
free(temp);
}
// 输出最后一个出列的人员编号
printf("最后一个出列的人员编号:%d\n", current->data);
// 释放头节点的内存
free(current);
}
```
最后,我们可以在主函数中调用上述函数来解决约瑟夫问题。
```c
int main() {
int n, k, m;
printf("请输入总人数n:");
scanf("%d", &n);
printf("请输入从第k个人开始报数:");
scanf("%d", &k);
printf("请输入报数m次出列:");
scanf("%d", &m);
Node* head = createCircularLinkedList(n);
josephusProblem(head, k, m);
return 0;
}
```
这样,我们就可以通过C语言的单向链表来实现约瑟夫问题了。