已知链表结构为:typedef struct Node{int data; struct Node *next;}Node;编写函数实现:在链表的倒数第k个位置插入元素x(即x成为链表的倒数第k个元素),插入成功返回1,不成功返回0(假设链表结点都在堆区)。函数原型为:int fun(Node *h, int x, int k);
时间: 2024-03-22 10:37:45 浏览: 19
好的,根据您的要求,下面是实现在链表的倒数第k个位置插入元素x的函数的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
int fun(Node *h, int x, int k) {
Node *p = h;
Node *q = h;
int i;
for (i = 0; i < k && p != NULL; i++) {
p = p->next;
}
if (i < k) {
return 0;
}
while (p->next != NULL) {
p = p->next;
q = q->next;
}
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = x;
new_node->next = q->next;
q->next = new_node;
return 1;
}
int main() {
Node *h = (Node*)malloc(sizeof(Node));
h->data = 1;
h->next = NULL;
Node *p = h;
int i;
for (i = 2; i <= 5; i++) {
Node *new_node = (Node*)malloc(sizeof(Node));
new_node->data = i;
new_node->next = NULL;
p->next = new_node;
p = new_node;
}
printf("原链表:");
p = h;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
int ret = fun(h, 6, 3);
if (ret == 1) {
printf("插入成功,插入后的链表:");
p = h;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
} else {
printf("插入失败,链表不足%d个元素\n", k);
}
p = h;
while (p != NULL) {
Node *q = p;
p = p->next;
free(q);
}
return 0;
}
```
在上面的代码中,我们首先创建一个长度为5的链表,并打印出来。然后我们调用fun函数,将x=6,k=3传入,表示在链表的倒数第3个位置插入元素6。在fun函数中,我们使用两个指针p和q来定位链表的倒数第k个位置,然后在该位置插入新的结点。最后根据插入结果返回1或0。在main函数中,我们根据fun函数的返回值打印插入成功或失败的信息,并打印插入后的链表。最后释放链表中所有结点的内存空间。