2017-04-05 4 views
0

Ich bekomme einen segfault, wenn ich in meine verkettete Liste einfügen und ich kann es einfach nicht finden. An einem Punkt würde es mir erlauben, bis zu drei Knoten einzufügen, aber jetzt segmentiert es nach der ersten Einfügung und durchläuft nicht die while-Schleife und für Anweisungen. Scanne ich die Informationen falsch in das Array ein? Ich muss in der Lage sein, mehrere Eingabewerte aufzunehmen, weil ich schließlich Knoten basierend auf String- und Zählwerten, die vom Benutzer angegeben werden, löschen und drucken kann.Linkeds Liste mit Strings

Eingabe vom Benutzer würde wie folgt aussehen:

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' nicht zugeordnet' int' Zeiger, aber Sie versuchen, zu 'scanf' hinein eine Schnur ... –

Antwort

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

Sie müssen sich für temp->symbol Speicher zuzuweisen. Der einfachste Weg, da Sie eine vorhandene Zeichenfolge sind zu kopieren ist strdup wie diese zu benutzen anstatt das zu tun, dass strcpy

temp->symbol=strdup(str); 
0

Sie müssen auch Speicher für die Variable Symbol zuweisen. Machen Sie Ihre Insert-Funktion wie folgt:

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