用C语言生成一个双向链表,需要生成线性表3 55 2 9 7 32 66,遍历输出线性表并给出表长,然后将学号后三位数值插入到第3个位置,遍历输出线性表并给出表长,最后将第5个元素删除,遍历输出线性表, 给出表长和被删除元素。 销毁线性表,显示销毁结果。
时间: 2024-10-09 15:09:23 浏览: 0
在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) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 添加节点到链表末尾
void append(Node** head, int value) {
Node* newNode = createNode(value);
if (!newNode) return;
if (*head == NULL) {
*head = newNode;
} else {
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
newNode->prev = temp;
}
}
// 遍历并打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 获取链表长度
int getLength(Node* head) {
int length = 0;
Node* temp = head;
while (temp != NULL) {
length++;
temp = temp->next;
}
return length;
}
// 将第3个元素后的数值插入到第3个位置
void insertAfterThirdElement(Node** head, int value) {
Node* thirdNode = findNode(head, 3);
if (!thirdNode) {
printf("Third node not found.\n");
return;
}
Node* newNode = createNode(value);
if (!newNode) return;
newNode->prev = thirdNode;
newNode->next = thirdNode->next;
if (thirdNode->next != NULL) {
thirdNode->next->prev = newNode;
}
thirdNode->next = newNode;
}
// 删除第5个元素
void deleteFifthElement(Node** head) {
if (getLength(*head) < 5) {
printf("No fifth element to delete.\n");
return;
}
Node* fifthNode = findNode(head, 5);
if (!fifthNode) {
printf("Fifth node not found.\n");
return;
}
if (fifthNode->prev) {
fifthNode->prev->next = fifthNode->next;
} else {
// 如果第五个是头结点
*head = fifthNode->next;
}
if (fifthNode->next) {
fifthNode->next->prev = fifthNode->prev;
}
free(fifthNode);
}
// 查找特定索引的节点
Node* findNode(Node* head, int index) {
Node* temp = head;
for (int i = 1; i <= index && temp != NULL; i++) {
temp = temp->next;
}
return temp;
}
// 销毁链表
void destroyList(Node** head) {
Node* current = *head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
*head = NULL;
printf("Chain list has been destroyed.\n");
}
// 主函数演示操作
int main() {
Node* head = NULL;
append(&head, 3);
append(&head, 55);
append(&head, 2);
append(&head, 9);
append(&head, 7);
append(&head, 32);
append(&head, 66);
printf("Original list:\n");
printList(head);
printf("Length: %d\n", getLength(head));
insertAfterThirdElement(&head, 5); // 将5插入到第3个位置
printf("After inserting 5 at position 3:\n");
printList(head);
printf("Length: %d\n", getLength(head));
deleteFifthElement(&head); // 删除第5个元素
printf("After deleting the fifth element:\n");
printList(head);
printf("Length: %d\n", getLength(head));
destroyList(&head); // 销毁链表
return 0;
}
```
这个程序首先创建了一个包含给定数列的双向链表,然后按照需求进行了修改和操作。运行`main()`函数即可看到整个过程。