简体   繁体   中英

Delete Node from linkedlist

I wrote a phone book it can search among entities now I wrote a delete function but I don't know how to use it in a good manner if I call search and then delete it how? i should give a flag on search function? I want to when user entered any Number,Email,... if there exists delete it I don't know my function in delete is correct or not suppose for the first time the linked list is not empty

#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;

And you might want to change your deletenode function. I don't think you need to have four conditions there. You could just pass the node and delete it. And instead of 0 you should make it NULL. It would be better to find bugs in your program.

Please take a look at this . This explains the delete item in a linked list.

Basically you should consider the following scenarios when deleting a node in a linked list!

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM