pouria pouria - 2 months ago 21
C Question

linked list char pointer scanf input

I'm attempting to input multiple times to a char pointer in linked list using

. but every time I enter new input the
changes in all the fields.

here is my linked list:

struct node {
struct node *next;
int level;
char *name;

here is my main function:

struct node *root = NULL;
while (1) {
char arrays[12];
char *n;
n = arrays;
int i = NULL;
printf("Enter level: ");
scanf("%i", &i);
printf("\nEnter name: ");
scanf("%s", arrays);
insert(&root, i, n, compare);

insert function:

void insert(struct node **head, const int level, char *name, int(*cmp)(struct node *l, struct node *r))
struct node *new;
new = malloc(sizeof *new);
new->level = level;
new->name = name;

/* Find the insertion point */
for (; *head != NULL; head = &(*head)->next)
if ((*head)->level > level || (*head)->level == level && cmp(*head, new) > 0) { break; }
new->next = *head;
*head = new;

basically if I input:

input: | expected output: | actual output:
1 smith | 1 john | 1 alice
1 john | 1 smith | 1 alice
3 malek | 2 alice | 2 alice
2 alice | 3 malek | 3 alice

note: the functions are working as expected when I'm entering data manually without

insert(&root, 1, "Abbas", compare);
insert(&root, 1, "Calbass", compare);


This line:

new->name = name;

just change the value of pointer - it does not copy a string. So all elements in the linked list will point to arrays. So changing the contents of arrays will make it look as if all elements in the list was changed (but they wasn't).

You probably need:

strcpy(new->name, name);

and then you need to malloc memory for the string as well.

Something like:

new = malloc(sizeof *new);
new->level = level;
new->name = malloc(12 * sizeof(char));  // Memory for the string
strcpy(new->name, name);                // Copy the input string



    insert(&root, i, n, compare);


    insert(&root, i, arrays, compare);

and remove the nvariable. The functionality is the same but the coder is easier to read and understand.