用C语言,写一函数,在带头结点的单链表 llist 中, p 指向的结点前边插入值为 x 的新结点,返回成功与否的标志。
时间: 2024-10-13 22:09:38 浏览: 32
在C语言中,我们可以创建一个函数来实现这个功能,名为`insertBeforeNode`,它会在给定节点`p`之前插入一个新的节点。假设我们的链表节点结构如下:
```c
typedef struct Node {
int data;
struct Node* next;
} Node;
```
函数原型可以这样定义:
```c
int insertBeforeNode(Node** llist, int p_data, int x) {
// ... 实现函数...
}
```
这里,`llist`是一个指向链表头节点的指针,`p_data`是要在其前面插入的新节点数据,`x`是新节点的值。
下面是函数的实现:
```c
int insertBeforeNode(Node** llist, int p_data, int x) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 新建节点
if (newNode == NULL) { // 内存分配失败返回错误
return -1;
}
newNode->data = x; // 设置新节点的值
// 遍历查找要插入位置的前一个节点
Node* prevNode = *llist;
while (prevNode->next != NULL && prevNode->next->data != p_data) {
prevNode = prevNode->next;
}
if (prevNode == NULL) { // 要插入的位置不在链表中,返回错误
free(newNode);
return -1;
}
// 插入新节点
newNode->next = prevNode->next;
prevNode->next = newNode;
return 0; // 成功插入,返回0
}
```
这个函数首先检查是否有足够的内存分配给新节点,如果没有则返回-1。接着找到`p_data`所在的节点的前一个节点,然后将新节点插入该位置。如果`p_data`不存在于链表中,说明无法插入,同样返回-1。
阅读全文