2017-04-05 68 views
0

当我插入到链接列表中时,出现段错误,我无法找到它。在某一点上,它允许我插入最多三个节点,但现在它在第一次插入后发生段错误,并且不会遍历while循环和语句。我是否将信息错误地扫描到数组中?我必须能够接受多个输入值,因为最终我需要能够根据用户给出的字符串和计数值来删除和打印节点。从用户使用字符串的链接列表

输入应该是这样的:

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); 

您需要为temp->symbol分配内存。因为你复制现有字符串的最简单的方法是使用strdup这样,而不是那样做strcpy

temp->symbol=strdup(str); 
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); 
} 
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; 
} 
}