用C语言写出代码1、建立一个双向循环链表,并从屏幕显示链表元素列表。2、删除链表某位置上的元素,并保持链表原有的顺序不变。
时间: 2024-12-24 09:35:16 浏览: 3
在C语言中,我们可以使用结构体表示节点,同时定义两个指针分别指向前一个节点和下一个节点,来构建双向循环链表。下面是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 创建一个新的双向循环链表节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = value;
newNode->prev = newNode->next = newNode; // 初始化双循环链接
}
return newNode;
}
// 显示链表元素列表
void displayList(Node* head) {
Node* temp = head;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head); // 循环直到头节点
printf("\n");
}
// 删除链表某个位置的元素
void deleteElement(Node** head, int position) {
if (*head == NULL || position <= 0)
return;
Node* current = *head;
Node* previous = NULL;
for (int i = 1; i < position && current != NULL; ++i) {
previous = current;
current = current->next;
}
if (current == NULL)
return; // 未找到指定位置
// 如果需要删除的是头节点,特殊处理
if (!previous)
*head = current->next;
else
previous->next = current->next;
free(current); // 释放已删除节点的内存
}
int main() {
Node* listHead = createNode(1); // 创建链表
listHead->next = createNode(2);
listHead->next->prev = listHead;
listHead->next->next = createNode(3);
listHead->next->next->prev = listHead->next;
printf("Initial List:\n");
displayList(listHead);
int positionToDelete = 2; // 要删除的位置
deleteElement(&listHead, positionToDelete);
printf("After deleting element at position %d:\n", positionToDelete);
displayList(listHead);
return 0;
}
```
在这个示例中,我们首先创建了一个包含三个元素的双向循环链表。然后展示原始链表,接着删除指定位置的元素并再次显示链表。
阅读全文