到目前为止,这是我的代码:
struct stockRecord {
int code;
char name[MAXNAMELEN];
struct stockRecord* next;
};
struct stockRecord* temp = NULL;
struct stockRecord* head = NULL;
struct stockRecord* prevptr = NULL;
struct stockRecord* resfun(struct stockRecord* list)
{
temp = list;
if (head == NULL) head = list;
if (temp == NULL) {
return head;
} else {
if (prevptr == NULL) { //first node
if (strstr(temp->name, "ABC-") != NULL) {
temp = temp->next; //remove the current node
}
}
prevptr = list;
if (temp->next == NULL) {
return head;
} else {
return resfun(temp);
}
}
}
我不知道如何删除节点,并重新链接邻居节点。然后我需要将头节点返回到主函数。
请有人帮忙吗?
感谢。
答案 0 :(得分:3)
维加,
要从单链接列表中删除第一个元素,您真正需要做的就是“忘记”第一个元素(头部)。
删除第一个节点的一般过程是:
删除列表中间中的节点的一般过程是:
删除最后一个节点的一般步骤是(我打赌你可以猜到):
递归与它无关。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define SIZE_OF_NAME 12
#define SUCCESS 0
typedef struct Stock* stock;
struct Stock {
int code;
char name[SIZE_OF_NAME];
stock next;
};
stock head = NULL;
stock prev = NULL;
stock StripABC(stock curr)
{
if (strstr(curr->name, "ABC-") != NULL) {
// the first name contains "ABC-", so strip it.
head = head->next;
curr = head;
}
return head;
}
int main(int argc, char *argv[])
{
struct Stock a, b;
a.code = 1; strcpy(a.name, "ABC-");
b.code = 2; strcpy(b.name, "Widget");
head = &a;
head->next = &b;
StripABC(head);
printf("head->name: %s\n", head->name);
return SUCCESS;
}
祝你好运。顺便说一句,链接列表仍然是ansi-c程序员的“交易库存”。我仍然经常和他们一起工作; - )
干杯。基思。
答案 1 :(得分:1)
您的代码有点难以理解。但我会尽力帮助
这一行:
temp = temp->next; //remove the current node
实际上并未从列表中删除该节点。它应该看起来像这样
prev->next = temp->next; // link the previous node past the current node
free(temp); // now that nothing is pointing to temp, you can deallocate the memory
return head; // we found our node, return the head of the list
此外,您应添加一些代码以检查要删除的节点位于列表头部的情况。在这种情况下,不需要重新链接节点。只需将头指针设置为列表中的下一个节点,然后删除temp。