用c语言编写,设有一个带头结点的单向链表,要求:在此链表中查找值为X的节点,若找到该节点则将其在链表中删除,若未找到则将其放到该链表的最后位置。
时间: 2024-10-06 16:00:39 浏览: 18
在C语言中,我们首先需要定义一个链表节点结构体和相应的链表操作函数。这里是一个基本的实现,包括插入、查找和删除操作。假设我们有以下结构体定义:
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
ListNode* insertIfNotExists(ListNode** head, int value) {
ListNode* newNode = malloc(sizeof(ListNode));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = *head;
if (*head != NULL && (*head)->data == value) {
free(newNode);
return *head;
} else {
*head = newNode;
return *head;
}
}
ListNode* searchAndDeleteOrAppend(ListNode* head, int value) {
ListNode* current = head;
while (current != NULL) {
if (current->data == value) {
ListNode* temp = current;
current = current->next;
free(temp);
return head;
}
current = current->next;
}
// 如果没找到,添加到链表尾部
current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = malloc(sizeof(ListNode));
if (!current->next) {
printf("Memory allocation failed.\n");
return NULL;
}
current->next->data = value;
current->next->next = NULL;
return head;
}
```
在这个实现中,`insertIfNotExists` 函数负责插入新节点(如果值存在则删除),而 `searchAndDeleteOrAppend` 函数则搜索并处理节点。
注意:这段代码假设链表头节点的`data`不是目标值`value`。如果头节点本身就是目标值,你需要先更新头节点。另外,内存管理需要谨慎,尤其是当链表为空或者找到目标值时。