2014-03-13 47 views
-2

我想在C++中創建一個鏈表的數組。如何在C++中創建鏈表的列表?

我想創建一個鏈接列表,可以添加/刪除新的學生名稱和ID。這裏是節點的結構:

struct node 
{ 
    char name[50]; 
    char id[50]; 
    struct node *next; 
}*start=NULL,*prev; 
typedef struct node node; 

如何做到這一點?

代碼:

#include<stdio.h> 
#include<stdlib.h> 
#include<ctype.h> 
#include<string.h> 

struct node 
{ 
    char name[50]; 
    char type[50]; 
    struct node *next; 
}*start=NULL,*prev; 
typedef struct node node; 

void menu(); 
void insertion(); 
void finder(); 
void table(); 
void deletion(); 

int main() 
{ 
    //node *table[57]; 

    while(1) 
    { 
     menu(); 
    } 
    return 0; 
} 

void menu() 
{ 
    int choice; 

    printf("\nSymbol Table Menu\n1. Insert.\n2. Find.\n3. Show Table.\n4. Delete.\n"); 

    scanf("%d",&choice); 
    //system("cls"); 
    if(choice==1)insertion(); 
    else if(choice==2)finder(); 
    else if(choice==3)table(); 
    else if(choice==4)deletion(); 

} 
int Hashing(node *temp) 
{ 
    int h,len,i,asc,sum=0; 
    printf("\nHashing\n"); 
    len=strlen(temp->name); 
    for(i=0; i<len; i++) 
    { 
     asc=temp->name[i]; 
     sum=sum+asc; 
    } 
    h=sum%57; 
    return h; 
} 
void insertion() 
{ 
    int index; 
    node *temp; 

    if (start == NULL) 
    { 
     start =(node*)malloc(sizeof(node)); 
     temp=start; 
     printf("Insert Name: "); 
     scanf("%s",start->name); 
     index=Hashing(temp); 
     printf("Index: %d\n",index); 
     printf("\nInsert Type: "); 
     scanf("%s",start->type); 
     start->next=NULL; 
     prev=start; 
    } 
    else 
    { 
     temp=(node*)malloc(sizeof(node)); 
     printf("Insert Name: "); 
     scanf("%s",temp->name); 
     index=Hashing(temp); 
     printf("Index: %d\n",index); 
     printf("\nInsert Type: "); 
     scanf("%s",temp->type); 
     temp->next= NULL; 
     prev->next=temp; 
     prev=temp; 
    } 
} 
void finder() 
{ 
    node *temp; 
    char key1[50]; 
    char key2[50]; 
    printf("\nInsert Search Key: "); 
    temp=start; 
    scanf("%s%s",key1,key2); 

    while(temp!=NULL) 
    { 
     if((strcmp(temp->name,key1)==0) && (strcmp(temp->type,key2)==0)) 
     { 
      printf("FOUND\n"); 
     } 
     temp=temp->next; 
    } 
} 
void table() 
{ 
    printf("\nFull Table\n\n"); 

    node *temp; 
    printf("Linked list = "); 
    temp=start; 

    if(temp==NULL) printf("No list\n"); 

    while(temp!=NULL) 
    { 
     printf("%s,%s -> ",temp->name,temp->type); 
     temp=temp->next; 
     if(temp==NULL)printf("NULL\n"); 
    } 
} 
void deletion() 
{ 
    node *temp,*temp1; 
    char del1[50]; 
    char del2[50]; 
    temp=start; 
    printf("Delete Name: "); 
    scanf("%s",del1); 
    printf("\nDelete Type: "); 
    scanf("%s",del2); 

    if((strcmp(temp->name,del1)==0) && (strcmp(temp->type,del2)==0)) 
    { 
     start=start->next; 
     free(temp); 
    } 
    else 
    { 
     while ((temp->next->next!=NULL)&&(strcmp(temp->next->name,del1)!=0)) 
     { 
      temp=temp->next; 
     } 
     if ((temp->next==NULL) &&(strcmp(temp->name,del1)!=0)) 
      printf("\nNot Found\n"); 
     else 
     { 
      temp1=temp->next; 
      temp->next=temp1->next; 
      free(temp1); 
     } 
    } 
    printf("DELETED\n"); 
} 
+5

在C++中:'std :: vector >'或'std :: array >'。 – user3383733

+1

雖然這有很多內容,但我仍然沒有看到嘗試實現鏈表解決方案。我只是看到可能來自講義甚至是網絡上的另一個網站。在鏈接列表中顯示您的嘗試。 – zero298

+0

另外,決定語言。 C和C++非常不同。 – user3383733

回答

0

創建的node秒的陣列,並單獨初始化它們中的每一個。

node *array = malloc(NUMBER_OF_NODES*sizeof(node *)); 
int i; 
for(i=0; i< NUMBER_OF_NODES; i++) 
{ 
    /* this part is optional - you might want to leave some of the cells uninitialized */ 
    array[i] = malloc(sizeof(node)); /* notice that we need to allocate space for a node - not (node *)! 
} 
+0

我明白你的意思,但不知道把它放在哪裏。請檢查我的代碼並提出建議。 – Tamim

+0

你的問題是如何創建這樣一個數組 - 嗯,你要在哪裏使用它?例如,如果你在全局需要它 - 那麼第一行(聲明)應該是全局的,而其餘的代碼應該在初始化上下文中 - 創建一個'initalize_array'函數並在你使用數組之前調用它第一次。 – Benesh

+0

起初我試過節點* Insertion(node * start);但後來將其更改爲全局鏈接列表。因爲我正在接受名稱的輸入並在'void insertion()'中輸入,所以我認爲數組應該在插入時調用,但是在插入數組之前我需要'int Hashing(node * temp)',因爲散列返回索引數。 – Tamim