用c语言实现双向链表
双向链表是一种常见的数据结构,它与单向链表相似,但与单向链表不同的是,双向链表中每个节点都有两个指针,一个指向前一个节点,一个指向后一个节点。这种结构使得双向链表可以在前后两个方向上遍历链表。
以下是用C语言实现双向链表的示例代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
Node *createNode(int data) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
Node *insertAtBeginning(Node *head, int data) {
Node *newNode = createNode(data);
if (head == NULL) {
head = newNode;
} else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
return head;
}
Node *insertAtEnd(Node *head, int data) {
Node *newNode = createNode(data);
if (head == NULL) {
head = newNode;
} else {
Node *temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
return head;
}
Node *deleteNode(Node *head, int data) {
if (head == NULL) {
return head;
} else if (head->data == data) {
head = head->next;
free(head->prev);
head->prev = NULL;
} else {
Node *temp = head;
while (temp != NULL && temp->data != data) {
temp = temp->next;
}
if (temp == NULL) {
printf("Element not found.\n");
} else {
temp->prev->next = temp->next;
if (temp->next != NULL) {
temp->next->prev = temp->prev;
}
free(temp);
}
}
return head;
}
void display(Node *head) {
if (head == NULL) {
printf("List is empty.\n");
} else {
Node *temp = head;
printf("List is: ");
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
}
int main() {
Node *head = NULL;
int choice, data;
while (1) {
printf("1. Insert at beginning.\n");
printf("2. Insert at end.\n");
printf("3. Delete.\n");
printf("4. Display.\n");
printf("5. Exit.\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter the element to be inserted: ");
scanf("%d", &data);
head = insertAtBeginning(head, data);
break;
case 2:
printf("Enter the element to be inserted: ");
scanf("%d", &data);
head = insertAtEnd(head, data);
break;
case 3:
printf("Enter the element to be deleted: ");
scanf("%d", &data);
head = deleteNode(head, data);
break;
case 4:
display(head);
break;
case 5:
exit(0);
default:
printf("Invalid choice.\n");
break;
}
}
return 0;
}
这个示例代码包含了以下操作:
- 创建一个新的双向链表节点。
- 在双向链表的开头插入一个节点。
- 在双向链表的结尾插入一个节点。
- 删除一个节点。
- 显示双向链表的所有节点。
- 退出程序。
你可以根据自己的需求修改这个代码,实现你自己的双向链表。
原文地址: https://www.cveoy.top/t/topic/w7W 著作权归作者所有。请勿转载和采集!