用C语言创建一个由6个结点的单向链表,实现结点的增加、删除、查找、移动、遍历显示等功能。
时间: 2023-12-21 13:03:24 浏览: 65
好的,我可以为您解答这个问题。下面是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct node {
int data; // 数据域
struct node* next; // 指针域
} Node;
// 创建一个由6个结点的单向链表
Node* createLinkedList() {
Node* head = NULL;
Node* tail = NULL;
for (int i = 1; i <= 6; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = i;
newNode->next = NULL;
if (head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 打印链表中的所有结点
void traverseLinkedList(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 在链表尾部插入一个新结点
void insertNode(Node** headRef, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
if (*headRef == NULL) {
*headRef = newNode;
} else {
Node* tail = *headRef;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newNode;
}
}
// 删除链表中指定数据的结点
void deleteNode(Node** headRef, int data) {
Node* p = *headRef;
Node* prev = NULL;
while (p != NULL && p->data != data) {
prev = p;
p = p->next;
}
if (p == NULL) {
printf("未找到要删除的结点\n");
return;
}
if (prev == NULL) {
*headRef = p->next;
} else {
prev->next = p->next;
}
free(p);
}
// 查找链表中指定数据的结点
Node* findNode(Node* head, int data) {
Node* p = head;
while (p != NULL && p->data != data) {
p = p->next;
}
return p;
}
// 移动指定数据的结点到链表尾部
void moveNodeToEnd(Node** headRef, int data) {
Node* p = *headRef;
Node* prev = NULL;
while (p != NULL && p->data != data) {
prev = p;
p = p->next;
}
if (p == NULL) {
printf("未找到要移动的结点\n");
return;
}
if (p->next == NULL) {
return;
}
if (prev == NULL) {
*headRef = p->next;
} else {
prev->next = p->next;
}
Node* tail = *headRef;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = p;
p->next = NULL;
}
int main() {
Node* head = createLinkedList();
printf("原链表:");
traverseLinkedList(head);
insertNode(&head, 7);
printf("插入结点后:");
traverseLinkedList(head);
deleteNode(&head, 4);
printf("删除结点后:");
traverseLinkedList(head);
Node* node = findNode(head, 3);
if (node == NULL) {
printf("未找到要查找的结点\n");
} else {
printf("查找到的结点:%d\n", node->data);
}
moveNodeToEnd(&head, 2);
printf("移动结点后:");
traverseLinkedList(head);
return 0;
}
```
上面的代码实现了一个由6个结点的单向链表,并提供了结点的增加、删除、查找、移动、遍历显示等功能。其中,createLinkedList()函数用于创建链表,traverseLinkedList()函数用于遍历链表并打印每个结点的数据,insertNode()函数用于在链表尾部插入一个新结点,deleteNode()函数用于删除链表中指定数据的结点,findNode()函数用于查找链表中指定数据的结点,moveNodeToEnd()函数用于将指定数据的结点移动到链表尾部。
阅读全文