用C++创建一个带头结点的单链表,此单链表长度为 10,插入一个新的结点,其值为 27,成为单链表的第 5 个结点,删除第2个结点,查找元素5和元素11,如果查找成功,程序能够输出显示该结点位置信息;如果查找失败, 程序应显示“该单链表中无此数据元素”信息。
时间: 2023-08-31 12:24:38 浏览: 79
C++单链表的创建插入、删除
5星 · 资源好评率100%
### 回答1:
好的,以下是您的问题:
使用C语言创建一个带头结点的单链表,长度为10,插入一个新的值为27的节点作为单链表的第5个节点,删除第2个节点,查找元素5和元素11并输出位置信息或失败信息。
我明白了您的问题,让我为您解答。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int data; // 节点数据
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 创建一个链表并返回头结点指针
ListNode* createList() {
ListNode* head = (ListNode*) malloc(sizeof(ListNode));
head->next = NULL;
return head;
}
// 向链表中插入一个新节点
void insertNode(ListNode* head, int data, int pos) {
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->data = data;
newNode->next = NULL;
ListNode* p = head;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("插入位置错误!");
return;
}
newNode->next = p->next;
p->next = newNode;
}
// 删除链表中的一个节点
void deleteNode(ListNode* head, int pos) {
ListNode* p = head;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || p->next == NULL || i > pos - 1) {
printf("删除位置错误!");
return;
}
ListNode* del = p->next;
p->next = del->next;
free(del);
}
// 在链表中查找一个节点并返回其位置(从1开始)
int findNode(ListNode* head, int data) {
ListNode* p = head->next;
int i = 1;
while (p != NULL && p->data != data) {
p = p->next;
i++;
}
if (p == NULL) {
printf("该单链表中无此数据元素!");
return -1;
} else {
printf("该数据元素所在位置为:%d\n", i);
return i;
}
}
// 打印链表中所有的节点
void printList(ListNode* head) {
ListNode* p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
ListNode* head = createList();
// 初始化链表
for (int i = 1; i <= 10; i++) {
insertNode(head, i, i);
}
printf("插入元素27在第5个位置:");
insertNode(head, 27, 5);
printList(head);
printf("删除第2个元素:");
deleteNode(head, 2);
printList(head);
int pos5 = findNode(head, 5);
int pos11 = findNode(head, 11);
return 0;
}
```
运行结果:
```
插入元素27在第5个位置:1 2 3 4 27 5 6 7 8 9 10
删除第2个元素:1 3 4 27 5 6 7 8 9 10
该数据元素所在位置为:5
该单链表中无此数据元素!
```
### 回答2:
要用C语言创建一个带头结点的单链表,可以参考以下代码:
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建带头结点的单链表
Node* createLinkedList(int length) {
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
Node *p = head;
for (int i = 0; i < length; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i + 1;
node->next = NULL;
p->next = node;
p = p->next;
}
return head;
}
// 在指定位置插入结点
void insertNode(Node *head, int position, int value) {
Node *p = head;
for (int i = 0; i < position; i++) {
if (p == NULL) {
printf("插入位置错误\n");
return;
}
p = p->next;
}
Node *node = (Node *)malloc(sizeof(Node));
node->data = value;
node->next = p->next;
p->next = node;
}
// 删除指定位置的结点
void deleteNode(Node *head, int position) {
Node *p = head;
for (int i = 0; i < position; i++) {
if (p->next == NULL) {
printf("删除位置错误\n");
return;
}
p = p->next;
}
Node *temp = p->next;
p->next = p->next->next;
free(temp);
}
// 查找指定元素的位置
int searchNode(Node *head, int value) {
Node *p = head->next;
int position = 1;
while (p != NULL) {
if (p->data == value) {
return position;
}
position++;
p = p->next;
}
return -1;
}
int main() {
Node *head = createLinkedList(10);
insertNode(head, 4, 27);
deleteNode(head, 2);
int position5 = searchNode(head, 5);
if (position5 != -1) {
printf("元素5的位置: %d\n", position5);
} else {
printf("该单链表中无此数据元素\n");
}
int position11 = searchNode(head, 11);
if (position11 != -1) {
printf("元素11的位置: %d\n", position11);
} else {
printf("该单链表中无此数据元素\n");
}
return 0;
}
希望以上代码能帮到您。
### 回答3:
首先,我们需要定义单链表的结构体节点,包含一个数据域和一个指向下一个节点的指针。
```C
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
```
接下来,我们创建带头结点的单链表,并插入新的结点。
```C
int main() {
Node *head = (Node*)malloc(sizeof(Node)); // 创建头结点
head->next = NULL; // 初始时链表为空
// 创建链表长度为10
Node *p = head;
for (int i=1; i<=10; i++) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = i; // 设置节点值
newNode->next = NULL;
p->next = newNode;
p = p->next;
}
// 插入新结点 27
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = 27;
newNode->next = head->next->next->next->next; // 第5个结点的位置
head->next->next->next->next = newNode;
// 删除第2个结点
Node *toBeDeleted = head->next->next;
head->next->next = head->next->next->next;
free(toBeDeleted);
// 查找元素5
int valueToFind = 5;
int position = 0;
p = head->next;
while (p != NULL) {
position++;
if (p->data == valueToFind) {
printf("元素 %d 的位置为 %d\n", valueToFind, position);
break;
}
p = p->next;
}
if (p == NULL) {
printf("该单链表中无元素 %d\n", valueToFind);
}
// 查找元素11
valueToFind = 11;
position = 0;
p = head->next;
while (p != NULL) {
position++;
if (p->data == valueToFind) {
printf("元素 %d 的位置为 %d\n", valueToFind, position);
break;
}
p = p->next;
}
if (p == NULL) {
printf("该单链表中无元素 %d\n", valueToFind);
}
// 释放内存
p = head->next;
while (p != NULL) {
Node *toBeFreed = p;
p = p->next;
free(toBeFreed);
}
free(head);
return 0;
}
```
通过以上代码,我们创建了一个带头结点的单链表,插入了新的结点27,删除了第2个结点,然后查找了元素5和元素11,并输出了它们的位置信息或"无此数据元素"的提示。最后释放了申请的内存空间。
阅读全文