如何实现一个十字链表的数据结构并提供相应的构造方法?
时间: 2024-11-13 12:20:12 浏览: 10
东北大学2000年数据结构试题.doc
十字链表(Cross-linked List)也称为双向循环链表,每个节点不仅有一个指向前一个节点的指针(next),还有一个指向下个节点的指针(prev)。这种数据结构常用于提高某些操作的效率,比如在两个方向上进行遍历。
以下是一个简单的C语言实现,包括构造方法(初始化一个空的十字链表):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义十字链表节点结构体
typedef struct CrossLinkedListNode {
int data;
struct CrossLinkedListNode* next;
struct CrossLinkedListNode* prev;
} CrossLinkedListNode;
// 初始化一个新的十字链表节点
CrossLinkedListNode* createNewNode(int value) {
CrossLinkedListNode* newNode = (CrossLinkedListNode*)malloc(sizeof(CrossLinkedListNode));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
// 构造方法:创建一个空的十字链表
CrossLinkedListNode* createCrossLinkedList() {
CrossLinkedListNode* head = NULL;
head->next = head; // 设置头节点为第一个也是最后一个节点
head->prev = head; // 同时设置头节点为前驱节点
return head;
}
// 插入元素到链表末尾
void insertAtEnd(CrossLinkedListNode** head, int value) {
CrossLinkedListNode* newNode = createNewNode(value);
if (!newNode) return;
newNode->prev = *head;
newNode->next = (*head)->next;
(*head)->next->prev = newNode;
(*head)->next = newNode;
}
// 打印链表(演示用)
void printCrossLinkedList(CrossLinkedListNode* head) {
CrossLinkedListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main() {
CrossLinkedListNode* list = createCrossLinkedList();
insertAtEnd(&list, 1);
insertAtEnd(&list, 2);
insertAtEnd(&list, 3);
printCrossLinkedList(list); // 输出:1 2 3
return 0;
}
```
在这个例子中,`createCrossLinkedList()` 是构造方法,它返回一个指向链表头部的新节点。`insertAtEnd()` 函数用来向列表末尾插入新节点。你可以根据需要扩展这个结构,如添加删除、搜索等方法。
阅读全文