c语言 - 从链表中删除节点



我正在尝试删除由出生号码给出的节点,例如9403133410。下次我打印链表时,我只想在输出中看到迈克。

这是我的文件.txt加载到链表中

***
Dave
9403133410
***
Mike
9458133410
***
Dave
9403133410

这是我的结构名为node_t

typedef struct node {
char                *presenter;
char                *birth_number;
struct node         *next;
}node_t;
node_t *node_new(){
node_t *node = malloc(sizeof(node_t));
node->next = NULL;
node->presenter = NULL;
node->birth_number = NULL;
return node;
}

这是我的加载函数

node_t *node_load(const char *file){
int counter = 0, number_entries = 0, db_loaded = 0;
char buffer[BUFFER_SIZE];
dbFile = fopen(DATABASE_FILE, "r");
if (!dbFile){printf("Zaznamy neboli najdene!n");}
node_t *ptr = NULL, *head = NULL;
while(fgets(buffer, BUFFER_SIZE, dbFile) != NULL){
switch(counter++){
case 0:
if (!ptr){
ptr = node_new();
head = ptr;
}
else{
ptr->next = node_new();
ptr = ptr->next;
}
number_entries++;
break;
case 1:
ptr->presenter = strdup(buffer);
break;
case 2:
ptr->birth_number = strdup(buffer);
counter = 0;
break;
}
}
fclose(dbFile);
return head;
}

这是我的删除节点函数:

void node_delete(node_t *head){
node_t *temp, *previous;
temp = head;
char birth_n[14];
scanf("%s", &birth_n);
strcat(birth_n, "n");
for ( ; temp->next != NULL; temp = temp->next){
if (strcmp(birth_n, temp->birth_number) == 0){
if (temp == head){
head = temp->next;
}
else{
previous = temp;
previous->next = temp->next;
}
free(temp);
}
}
}

所以我正在尝试删除其birth_number给出的节点。

调试功能:

void node_delete(node_t *head){
node_t *temp, *previous;
previous = temp = head;
char birth_n[14];
scanf("%s", &birth_n);
if (strcmp(birth_n, temp->birth_number) != 0){
head = head->next;
free(temp);
}
}

此函数应该删除第一个节点,但它不会删除它...

该函数没有意义。

首先,搜索到的字符串应该通过参数传递给函数。

其次,该函数处理指向头节点的指针值的副本。更改函数内的副本不会影响用作函数参数的原始指针。

至少而不是这个电话

scanf("%s", &birth_n);

你应该写

scanf("%13s", birth_n);

也不清楚为什么您尝试附加换行符 ''

strcat(birth_n, "n");

这个为循环

for ( ; temp->next != NULL; temp = temp->next){

当传递的指针为 null 指针时,可以调用未定义的行为。此外,当列表仅包含一个节点时,即使该节点包含目标字符串,也会跳过循环。

此外,当删除具有目标字符串的节点时,循环不会终止。

并在循环的第三个表达式中使用指针温度

temp = temp->next

在此声明之后

free(temp);

调用未定义的行为。

该函数可以如下所示

int node_delete( node_t **head, const char *birth_number )
{
while ( *head != NULL && strcmp( ( *head )->birth_number, birth_number ) != 0 )
{
head = &( *head )->next;
}
int success = *head != NULL;
if ( success )
{
node_t *temp = *head;
*head = ( *head )->next;
free( temp );
}
return success;
}

在主要情况下,您必须输入将要搜索的目标字符串,并且该函数至少像

node_delete( &head, birth_number );

您还可以检查函数的返回值,以确定是否删除了具有指定字符串的节点。

如果启用编译器警告并将警告视为错误,则可能会看到如下错误消息:

format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[14]’ [-Werror=format=]
|     scanf("%s", &birth_n);
|            ~^   ~~~~~~~~
|             |   |
|             |   char (*)[14]
|             char *

这告诉您scanf%s格式字符串与您提供给它的内容不兼容。你正在向它提供指向字符指针的指针,而不仅仅是你明确想要的字符指针。

您应该只传递birth_nscanf函数,如下所示:

scanf("%s", birth_n);

这与链表无关,而是 C 语言中的基本输入和字符串处理。

相关内容

  • 没有找到相关文章

最新更新