使用字符串链接列表

时间:2017-04-05 15:08:53

标签: c struct linked-list

当我插入链接列表时,我得到一个段错误,但我找不到它。有一次,它允许我插入最多三个节点,但现在它在第一次插入后会发生段错误,并且不会迭代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 个答案:

答案 0 :(得分:0)

Tom hasOwner Mammy

您需要为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

答案 1 :(得分: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;
}
}