用c语言实现一个循环链表的查找
时间: 2023-03-08 15:26:18 浏览: 71
我可以提供一种简单的方法:1.首先定义一个指针变量,它将从循环链表的头结点开始。2.然后通过比较指针变量和给定的值来查找指定的元素。3.如果指针变量的值与给定的值相等,则返回该元素的位置。4.如果指针变量的值与给定的值不等,则继续查找,直到指针变量指向循环链表的头结点,则结束查找。
相关问题
用c语言写一个循环链表解决两数之和问题的代码
下面是使用循环链表解决两数之和问题的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义循环链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建循环链表
Node* createCircularLinkedList(int n) {
Node* head = NULL;
Node* current = NULL;
for (int i = 0; i < n; i++) {
// 创建新节点
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败!");
exit(1);
}
// 输入节点值
printf("请输入第 %d 个节点的值:", i + 1);
scanf("%d", &(newNode->data));
// 将新节点加入链表
if (head == NULL) {
head = newNode;
current = newNode;
} else {
current->next = newNode;
current = newNode;
}
}
// 将最后一个节点的next指向头节点,形成循环链表
current->next = head;
return head;
}
// 计算两数之和
int sumOfTwoNumbers(Node* head, int num1, int num2) {
Node* temp = head;
int sum = 0;
// 遍历链表,查找num1和num2所在的节点,并计算两数之和
do {
if (temp->data == num1 || temp->data == num2) {
sum += temp->data;
}
temp = temp->next;
} while (temp != head);
return sum;
}
int main() {
int n; // 链表节点个数
int num1, num2; // 需要计算的两个数
printf("请输入链表节点个数:");
scanf("%d", &n);
Node* head = createCircularLinkedList(n);
printf("请输入需要计算的两个数:");
scanf("%d %d", &num1, &num2);
int sum = sumOfTwoNumbers(head, num1, num2);
printf("两数之和为:%d\n", sum);
return 0;
}
```
这段代码中,我们首先定义了循环链表的节点结构体 `Node`,然后通过 `createCircularLinkedList` 函数创建了一个循环链表,并将输入的节点值存储在链表中。接下来,使用 `sumOfTwoNumbers` 函数遍历链表,查找给定的两个数并计算它们的和。最后,将计算结果输出到控制台。
c语言实现双向循环链表
双向循环链表是一种常用的数据结构之一,可以在链表中进行快速的插入、删除和查找操作。以下是一种简单的C语言实现双向循环链表的代码:
```
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *prev;
struct node *next;
};
struct node *createNode(int data) {
struct node *newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
void insertAtBegin(struct node **head, int data) {
struct node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
} else {
struct node *last = (*head)->prev;
newNode->next = *head;
newNode->prev = last;
last->next = newNode;
(*head)->prev = newNode;
*head = newNode;
}
}
void insertAtEnd(struct node **head, int data) {
struct node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
(*head)->next = *head;
(*head)->prev = *head;
} else {
struct node *last = (*head)->prev;
newNode->prev = last;
newNode->next = *head;
last->next = newNode;
(*head)->prev = newNode;
}
}
void deleteNode(struct node **head, int data) {
if (*head == NULL) {
printf("List is empty.\n");
return;
}
struct node *cur = *head;
struct node *prev = NULL;
while (cur->data != data && cur->next != *head) {
prev = cur;
cur = cur->next;
}
if (cur->data != data) {
printf("%d not found in list.\n", data);
return;
}
if (cur == *head && cur->next == *head) {
*head = NULL;
free(cur);
return;
}
if (cur == *head) {
*head = cur->next;
}
struct node *next = cur->next;
prev->next = next;
next->prev = prev;
free(cur);
}
void displayList(struct node *head) {
if (head == NULL) {
printf("List is empty.\n");
return;
}
printf("List: ");
struct node *cur = head;
do {
printf("%d ", cur->data);
cur = cur->next;
} while (cur != head);
printf("\n");
}
int main() {
struct node *head = NULL;
insertAtBegin(&head, 10);
insertAtBegin(&head, 20);
insertAtEnd(&head, 30);
insertAtEnd(&head, 40);
displayList(head);
deleteNode(&head, 20);
deleteNode(&head, 50);
displayList(head);
return 0;
}
```
在这个例子中,我们使用了一个结构体来存储每个节点的数据和指向前一个和后一个节点的指针。我们还定义了一些操作函数,如创建新节点、在链表头部和尾部插入新节点、删除节点和显示链表等。在主函数中,我们创建了一个双向循环链表并进行了一些操作,最后输出链表的内容。