2.已知head指向一个带头结点的单向链表,链表中每个结点包含字符型数据和指向本结构结点的指针。编写函数实现在值为“jone”的结点前插入值为“marit”的结点,若没有值为“jone”的结点,则插在链表最后。
时间: 2023-06-23 08:08:47 浏览: 132
以下是实现该功能的C代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表结点
typedef struct Node {
char data;
struct Node *next;
} Node;
// 在值为“jone”的结点前插入值为“marit”的结点
void insert(Node *head, char *marit, char *jone) {
Node *prev = head;
Node *cur = head->next;
while (cur != NULL) {
if (strcmp(cur->data, jone) == 0) {
// 在jone前插入marit
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = *marit;
new_node->next = cur;
prev->next = new_node;
return;
}
prev = cur;
cur = cur->next;
}
// 没有找到jone,插入到链表末尾
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = *marit;
new_node->next = NULL;
prev->next = new_node;
}
int main() {
// 初始化链表
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
char str[] = "hello world";
for (int i = strlen(str) - 1; i >= 0; i--) {
Node *new_node = (Node *)malloc(sizeof(Node));
new_node->data = str[i];
new_node->next = head->next;
head->next = new_node;
}
// 插入结点
char marit[] = "m";
char jone[] = "j";
insert(head, marit, jone);
// 打印链表
Node *cur = head->next;
while (cur != NULL) {
printf("%c", cur->data);
cur = cur->next;
}
printf("\n");
// 释放链表空间
cur = head->next;
while (cur != NULL) {
Node *tmp = cur;
cur = cur->next;
free(tmp);
}
free(head);
return 0;
}
```
这里使用了带头结点的单向链表来存储数据,使用了字符串比较函数`strcmp`来比较链表结点中的数据是否为“jone”。如果找到了“jone”,则在其前面插入一个新结点;如果没有找到,则在链表末尾插入一个新结点。最后打印输出链表中的所有元素,并释放链表空间。
阅读全文