簡體   English   中英

從鏈表中刪除節點

[英]Delete Node from linkedlist

我寫了一部電話簿,它現在可以在實體之間進行搜索。我編寫了一個刪除函數,但是如果我調用搜索然后刪除它,我不知道如何很好地使用它。 我應該在搜索功能上標記嗎? 我想在用戶輸入任何Number,Email,...時將其刪除如果我存在刪除功能,我不知道我的刪除功能是否正確或第一次鏈接列表不為空

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
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;

您可能想要更改deletenode函數。 我認為您不需要在那里滿足四個條件。 您可以只傳遞節點並將其刪除。 並且應將其設為NULL,而不是0。 最好在程序中查找錯誤。

請看一下這個 這說明了鏈接列表中的刪除項目。

刪除鏈表中的節點時,基本上應該考慮以下情形!

(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..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM