从链表中删除节点 [英] Delete Node from linkedlist

查看:43
本文介绍了从链表中删除节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一部电话簿,现在我编写了一个删除功能,它可以在实体之间进行搜索但是如果我调用搜索然后删除它,我不知道如何很好地使用它?我应该在搜索功能上加一个标志吗?我想当用户输入任何数字,电子邮件,...时如果存在,将其删除我不知道删除功能是否正确第一次假设链接列表不为空

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

推荐答案

请查看

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

这篇关于从链表中删除节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆