gpt4 book ai didi

c - C中的链表删除

转载 作者:行者123 更新时间:2023-11-30 17:36:19 26 4
gpt4 key购买 nike

这是我的代码,我不知道它有什么问题。当我使用键盘输入“删除”列表中的项目时,它会更改其他项目的名称。此外,当我输入不在列表中的名称时,它会删除项目。如何解决?

     #include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
struct list
{
char name[20];
int age;
char gender[10];
struct list *next;
};

void main(void)
{
struct list *HEAD = NULL;
struct list *temp,*current, *trav;
struct list *prev;

char choice;


while(1)
{
clrscr();
printf("MENU\n");
printf("A) ADD\n");
printf("B) DISPLAY\n");
printf("C) DELETE\n");
printf("X) EXIT\n");

scanf("%c", &choice);
switch(toupper(choice))
{
case 'A':
temp= (struct list*)malloc(sizeof(struct list));
temp->next=NULL;
printf("Fill-Up the following:\n");
printf("Name:");
fflush(stdin);
gets(temp->name);
printf("Age:");
fflush(stdin);
scanf("%d",&temp->age);
printf("Gender:");
fflush(stdin);
gets(temp->gender);


if(HEAD == NULL)
{
HEAD = temp;

}
else if(HEAD!=NULL)
{
for(trav=HEAD; trav->next != NULL; trav= trav->next);
trav->next=temp;
}
else
{
printf("Not Enough Memory!\n");
}


break;
case 'B':

if(HEAD==NULL)
{
printf("Linked List is Empty!\n");
getch();
}
else{
for(trav=HEAD; trav != NULL; trav=trav->next )
{

printf("\nName: %s\n", trav->name);
printf("Age: %d\n", trav->age);
printf("Gender: %s\n\n", trav->gender);
}
getch();

}

break;

case 'C' :
if(HEAD==NULL)
{
printf("No item to be delete. List is Empty!\n");
getch();
}
else {
printf("Enter The Name of the item you want to Delete: ");
fflush(stdin);
gets(temp->name);
current=HEAD;

if(strcmp(temp->name,current->name)== 0)
{
HEAD=HEAD->next;
free(current);
printf("Item has been successfully deleted from the list.\n");
getch();
}
else
{
for(prev=HEAD,trav=HEAD->next; strcmp(trav->name,temp->name)!=0 ; trav=trav->next,prev=prev->next);
if(trav==NULL)
{
printf("Name: %s not found!", temp->name);
getch();
}
else{
prev->next=trav->next;
free(trav);
printf("Item has been successfully deleted from the list.\n");
getch();
}

}
}
break;
case 'X':
if(HEAD!=NULL){free(HEAD); }
if(trav!=NULL){ free(trav); }
if(temp!=NULL){ free(temp); }
exit(1);

break;

}

}

}

最佳答案

要获取要删除的项目的名称,请执行gets(temp->name);。但 temp 指向您在列表中添加的最后一项。因此,当您读取 temp->name 中的名称时,最后一个项目的名称将会更改。

要纠正该行为,请分配新项目并将其添加到链接列表中。

关于c - C中的链表删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22729277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com