从链表中删除节点

我写了一个电话簿,它可以在实体之间进行搜索,现在我写了一个删除function,但如果我调用搜索然后将其删除,我不知道如何以良好的方式使用它? 我应该在搜索function上给一个标志? 我想当用户输入任何数字,电子邮件,…如果存在删除它我不知道我的删除function是否正确或假设第一次链表不为空

#include  #include  #include  #include  struct node { char Number[10]; char FirstName[10]; char LastName[10]; char FatherName[10]; char Email[20]; char SiteName[30]; struct node *next; struct node *pre; }; void print(struct node* list) { printf("FIRSTNAME: "); printf(list->FirstName); printf("\n"); printf("LASTNAME: "); printf(list->LastName); printf("\n"); printf("FATHERNAME: "); printf(list->FatherName); printf("\n"); printf("EMAIL: "); printf(list->Email); printf("\n"); printf("SITENAME: "); printf(list->SiteName); printf("\n"); printf("NUMBER: "); printf(list->Number); } void search(struct node* list,char* sr,int option) { struct node *current =list; current=current->next; switch(option) { case 1: while(current!=0) { int flag=strcmp(current->Number,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; case 2: while(current!=0) { int flag=strcmp(current->FirstName,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; case 3: while(current!=0) { int flag=strcmp(current->LastName,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; case 4: while(current!=0) { int flag=strcmp(current->FatherName,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; case 5: while(current!=0) { int flag=strcmp(current->Email,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; case 6: while(current!=0) { int flag=strcmp(current->SiteName,sr); if(flag==0) { printf("you searched This person!\n"); print(current); current=current->next; } else{ current=current->next; } } break; } } void deleteNode(struct node* node) { if(node->next==0 && node->pre==0)//we have just 1 node { free(node); } if(node->next!=0 && node->pre!=0)//node is among nodes { struct node * temp1 = node->next; struct node * temp2 = node->prev; temp2->next=node->next; temp1->pre=temp2; free(node); } if(node->next!=0 && node->pre==0)//begining of the list { struct node * temp1 = node->next; temp1->pre=0; free(node); } if(node->next=0 && node->pre!=0)//end of the list { struct node* temp2=node->pre; temp2->next=0; free(node); } } void addNode(struct node *head) { struct node *current = head; struct node *newNode = malloc(sizeof(struct node)); puts("*******Now you can insert a new person\n****"); printf("FIRSTNAME: "); gets(newNode->FirstName); printf("LASTNAME: "); gets(newNode->LastName); printf("FATHERNAME: "); gets(newNode->FatherName); printf("EMAIL: "); gets(newNode->Email); printf("SITENAME: "); gets(newNode->SiteName); printf("NUMBER: "); gets(newNode->Number); //create new node newNode->next = 0; // Change 1 if(current->next==0) { current->next=newNode; newNode->pre=current; } else { while (current->next != 0) { current = current->next; } current->next = newNode; newNode->pre=current; } // printf("added later\n"); } //************************************************************************* int main() { printf("please choose your option:\n"); printf("1.search\n2.add\n3.delete\n4.Sort\n5.Edit\n6.show the list\n7.Exit\n"); struct node *root; struct node *conductor; root = malloc( sizeof(struct node) ); root->next = 0; // addNode(root); // char c=getchar(); //********************************* strcpy(root->FirstName, "root"); strcpy(root->LastName, "last"); // print(root); addNode(root); addNode(root); printf("SEARCH\n"); printf("in which group you want to search?\n"); printf("1.Number\n2.FirstName\n3.LastName\n4.FatherName\n5.Email\n6.Site\n"); int num; scanf("%d", &num); switch(num) { char s[20]; case 1: printf("please enter your Number to search!"); scanf("%s",s); search(root,s,num); break; case 2: printf("please enter your FirstName to search!\n"); scanf("%s", s); search(root,s,num); break; case 3: printf("please enter your LastName to search!\n"); scanf("%s", s); search(root,s,num); break; case 4: printf("please enter your FatherName to search!\n"); scanf("%s", s); search(root,s,num); break; case 5: printf("please enter your Email to search!\n"); scanf("%s", s); search(root,s,num); break; case 6: printf("please enter your Site to search!\n"); scanf("%s", s); search(root,s,num); break; } return 0; } 

  case 3: while(current!=0) { int flag=strcmp(current->LastName,sr); if(flag==0) { printf("you searched This person!\n"); print(current); deletenode(current) } else{ current=current->next; } } break; 

您可能想要更改您的删除节点function。 我认为你不需要有四个条件。 您只需传递节点并将其删除即可。 而不是0你应该使它为NULL。 最好在程序中找到错误。

请看一下这个 。 这解释了链表中的删除项。

删除链表中的节点时,您应该考虑以下方案!

 (1) deleting head delete element and adjust head pointer (2) deleting tail delete element and adjust tail pointer (3) one element list if data is the data for the only element then delete the list and set head and tail pointers to NULL (4) all the other cases traverse through the list and hold the previous pointer. delete element and adjust the next pointers. (5) if not the above cases, then element not present.. do nothing..