2011-12-26 12 views
0

私はエンティティ間で検索できる電話帳を作成しました。削除機能を作成しました。 検索を呼び出して削除すると、良い方法で使用する方法がわかりません。 検索機能にフラグを付ける必要がありますか? ユーザーが それを削除が存在する場合、私は削除して、私の機能を知っていない任意の番号、電子メール、... に入ったとき、リンクリストがリンクリストからノードを削除

空ではありません初めて仮定が正しいかではない である私がしたいです
#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; 
} 
+0

投稿ごとに1つの質問のみ。別の投稿に2番目の質問(リスト内のノードを並べ替える)を投稿し、最初の投稿を編集しないでください(リストからノードを削除してください)! –

+0

-1同じ質問の古い投稿を使用しています。 –

+0

新しい質問がある場合は新しい質問で*あなたの質問を編集しない*新しい質問を追加する*そうすることで、以前に投稿されたすべての回答が無効になり、コンテンツ全体が役に立たなくなります。これをやり直すことで、さらにモデレータとしての行動を起こす可能性があります。 – casperOne

答えて

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; 

また、削除ノード機能を変更することもできます。私はあなたがそこで4つの条件を持つ必要はないと思う。あなたは単にノードを渡して削除することができます。 0の代わりにNULLにする必要があります。あなたのプログラムにバグを見つけるほうが良いでしょう。

0

thisをご覧ください。これはリンクされたリストの削除項目を説明します。

基本的に、リンクされたリストのノードを削除する際には、次のシナリオを考慮する必要があります。

(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.. 
関連する問題