2013-03-13 75 views
0

我使用由函數使用讀取contactList.txt中的指針的函數操縱的雙向鏈接列表編寫聯繫人管理器。將文本文件讀取到雙向鏈接列表

#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
#include<process.h> 
#include<stdlib.h> 
#include<dos.h> 

//functions 
listelement * getFirst(listelement *listpointer,string query[MAX]); 
void getLast(); 
void getEmail(); 
void getCompany(); 
void getNumber(); 
void editCon(); 
void delCon(); 
void addCon(); 
void listAll(); 
void sortCon(); 
void Menu (int *choice); 

#define MAX 20 
//struct to order contactList 
struct contact 
{ 
    string firstName[MAX],lastName[MAX],email[MAX],companyName[MAX]; 
    long phoneNum[MAX]; 
    struct listelement *link 
    struct contact *next; 
    struct contact *prev; 

}list; 



int main() 
{ 
    listelement listmember, *listpointer; 
    string query;int iChoice = 0; 
    listpointer = NULL; 


    Menu (&iChoice); 
    int iChoice; 

    fflush(stdin); 
    scanf_s("%d", &iChoice); 
    // user enters one of 9 values 
    // options are as follows: get first name,last name,list all contacts,search through contacts,add a new contact,edit/delete or sort contacts. 
    switch(iChoice) 
    { 
     case 1:  
     { 
      printf ("Enter contact first name to get details "); 
      scanf ("%d", &query); 
      listpointer = getFirst (listpointer, query); 
      break; 
     } 
     case 2:  
     { 
      getLast(); 
      break; 
     } 
     case 3:  
     { 
      listAll(); 
      break; 
     } 
     case 4:  
     { 
      getEmail(); 
      break; 
     } 
     case 5:  
     { 
      getCompany(); 
      break; 
     } 
     case 6:  
     { 
      getNumber(); 
      break; 
     } 
     case 7:  
     { 
      addCon(); 
      break; 
     } 
     case 8:  
     { 
      editCon(); 
      break; 
     } 
     case 9:  
     { 
      delCon(); 
      break; 
     } 
     case 10:   
     { 
      sortCon(); 
      break; 
     } 
     case 11:  // exit 
     { 
      printf("\n\nProgram exiting!..."); 
      exit(0);//terminates program 
      break; 
     } 
     default: 
     printf ("Invalid menu choice - try again\n"); 
     break; 

    }//end of switch 
    return(iChoice); 


}//end of main 
//menu function to test if invalid input was entered in a menu choice. 
void Menu (int *iChoice) 
{ 
    char local; 

    system("cls"); 
    printf("\n\n\t\\n\n"); 
    printf("\n\n\t\tWelcome to my Contact Manager\n\n"); 
    printf("\n\t\t1. First name"); 
    printf("\n\t\t2. Last name"); 
    printf("\n\t\t3. List all contacts"); 
    printf("\n\t\t4. Search email"); 
    printf("\n\t\t5. Search company name"); 
    printf("\n\t\t6. Search number"); 
    printf("\n\t\t7. Add contact"); 
    printf("\n\t\t8. Edit contact"); 
    printf("\n\t\t9. Delete contact"); 
    printf("\n\t\t10. Sort contacts"); 
    printf("\n\t\t11. Exit"); 
    printf("\n\n\t\tEnter your menu choice: "); 

    do 
    { 
    local = getchar(); 
    if ((isdigit(local) == FALSE) && (local != '\n')) 
     { 
     printf ("\nYou must enter an integer.\n"); 
     printf (""); 
    } 
    } while (isdigit ((unsigned char) local) == FALSE); 

    *iChoice = (int) local - '0'; 
} 

//function to get a contact by entering first name 
listelement * getFirst (listelement *listpointer, string query) 
{ 
    //variables 
    char query[MAX],firstName[MAX]; 
    FILE *fp, *ft; 
    int i,n,ch,l,found; 

    system("cls"); 
    do 
    { 
    found=0; 


    l=strlen(query); 
    fp=fopen("ContactList.txt","r"); 

    system("cls"); 
    printf("\n\n..::Search result for '%s' \n===================================================\n",query); 
    while(fread(&list,sizeof(list),1,fp)==1) 
    { 
    for(i=0;i<=l;i++) 
    firstName[i]=list.firstName[i]; 
    firstName[l]='\0'; 
    if(stricmp(firstName,query)==0) 
    { 
    printf("\n..::First Name\t: %s\n..::Second Name\t: %ld\n..::Email\t: %s\n..::CompanyName\t: %s\n..::Number\t: %s\n",list.firstName,list.lastName,list.email,list.companyName.list.phoneNumber); 
    found++; 
    if (found%4==0) 
    { 
    printf("..::Press any key to continue..."); 
    getch(); 
    } 
    } 
    } 

    if(found==0) 
    printf("\n..::No match found!"); 
    else 
    printf("\n..::%d match(s) found!",found); 
    fclose(fp); 
    printf("\n ..::Try again?\n\n\t[1] Yes\t\t[11] No\n\t"); 
    scanf("%d",&ch); 
    }while(ch==1); 



} 

任何人有任何想法,在代碼中我會錯在何處感謝

回答

4

你的錯誤是因爲:

1)你不定義任何地方listelement

2)您沒有在任何地方定義string(並且它不是C中的類型)

3)您需要將#define MAX向上移動之前你使用它。

4)你不定義任何地方FALSE(它不是在C型)

5)你重新定義元素也是如此,在getFirst()您在query通過爲「字符串」,然後你 定義一個新的query作爲一個字符陣列

6)你會得到重新定義的錯誤,因爲你有多個定義。這有點5,但還有更多。在你的主聲明iChoice這裏:string query;int iChoice = 0; 那麼你再次聲明int iChoice;之後your Menu()呼叫

7)請不要做fflush(stdin)這是不確定的行爲按C標準