Delete Node from linkedlist

匆匆过客 提交于 2019-12-12 01:04:04

问题


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

回答1:


    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.




回答2:


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


来源:https://stackoverflow.com/questions/8634327/delete-node-from-linkedlist

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!