2017-04-05 12 views
0

リンクリストに挿入するとsegfaultが表示され、見つからないだけです。ある時点で最大3つのノードを挿入することができますが、最初の挿入後にsegfaultを実行し、whileループとforステートメントを繰り返し実行しません。情報をアレイに正しくスキャンしていませんか?私はいくつかの入力値を取り入れることができなければなりません。最終的には、ユーザーによって与えられる文字列とカウント値に基づいてノードを削除して印刷する必要があるからです。あなたがtemp->symbolにメモリを割り当てる必要がリンクされた文字列を使用したリスト

ins books 
ins table 
prl // to print list 
del v1 v5 //to delete nodes with count values that fall between 1 and 5 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct node 
{ 
    char *symbol;// each Node contains a array 'symbol' 
    int count; // each Node contains a symbol counter 
    struct node *next; 
    };// end struct 



void insert(struct node**,struct node **, char *str); 
void printL(struct node *); 




int main() 
{ 

    struct node *head; 
    struct node *tail; 

    head = NULL; 
    tail = NULL; 


    //Declare variables needed for input and output 
    char input[15]={0}; 
    char cmd [4]={0}; 
    char info[11] = {0}; 
    int *val={0}; 


    //possible command strings 
    char ins[]= "ins"; 
    char prl[]= "prl"; 
    char end[]= "end"; 


    // Prompt user for command and corresponding input 
    puts("Please enter a command with corresponding value(s) where necessary"); 
    scanf("%s%s%s", cmd,info, val); 


//While command is not 'end': 
while (strcmp(end,cmd) != 0){ 
     // Read value(s) for the command, in necessary 
     if (strcmp(ins,cmd)==0) 
     { 
      insert(&head, &tail, info); 
     } 

     if (strcmp(prl, cmd)==0) 
     { 
      printL(head); 
     } 


     puts("Please enter your next command and value where necessary:"); 

     scanf("%s%s%s", cmd,info, val); 




    } 
    return 0; 
} 
void insert(struct node **h, struct node **t, char * str) 
{ 

    struct node *temp; 

    if ((temp=(struct node *)malloc(sizeof(struct node)))==NULL) 
    { 
     printf("Memory allocation or node failed.\n"); 
     exit(1); 
    } 
    strcpy(temp->symbol,str); 
    temp->count= 1; 
    temp->next=NULL; 

    if(*h == NULL) 
    { 
     *h=*t=temp; 
    } 

    else 
    { 
    (*t)->next = temp; 
    *t = (*t)->next; 
    } 
} 

void printL(struct node *h) 
{ 
    // NodePtr hPtr = NULL; 
    //hPtr=malloc(sizeof(Node)); 
    //hPtr=head; 
    if(h == NULL){ 
     puts("The list is empty"); 
    } 
    else{ 

     while(h != NULL){ 
      printf("%s", h->symbol); 
      printf("\t %d", h->count); 
      h= h->next; 
     } 
     printf("\n"); 
    } 
} 
+2

'val'が割り当てられていない' int'ポインタ、まだあなたはそれにscanf'いくつかの文字列 'しようとしています... –

答えて

0
if ((temp=(struct node *)malloc(sizeof(struct node)))==NULL) 
{ 
    printf("Memory allocation or node failed.\n"); 
    exit(1); 
} 
strcpy(temp->symbol,str); 

:ユーザーから

入力は次のようになります。既存の文字列をコピーしているので、最も簡単な方法は、次のように代わりのstrcpy

temp->symbol=strdup(str); 
0

あなたはまた、可変シンボルにメモリを割り当てる必要があることをやってstrdupを使用することです。 次のようにinsert関数を作成します。

void insert(struct node **h, struct node **t, char * str) 
{ 

struct node *temp; 

if ((temp=(struct node *)malloc(sizeof(struct node)))==NULL) 
{ 
    printf("Memory allocation or node failed.\n"); 
    exit(1); 
} 
int count = 0; 
count=strlen(str); 
temp->symbol=malloc(count+1); 
strcpy(temp->symbol,str); 
temp->count= 1; 
temp->next=NULL; 

if(*h == NULL) 
{ 
    *h=*t=temp; 
} 

else 
{ 
(*t)->next = temp; 
*t = (*t)->next; 
} 
} 
関連する問題