Я пытаюсь реализовать связанный список с помощью этого кода. Этот код успешно выполняется, но приводит к ошибке ошибки сегментации (сбрасывается ядро). Как я могу решить эту проблему?

#include<stdio.h>
#include<stdlib.h>
struct node{
    char ch;
    struct node *next;
};
struct node *head=(struct node *)malloc(sizeof(struct node));
struct node *p1=NULL;
void addnode(char ch) {
    if(head==NULL) {
        head->ch=ch;
        head->next=NULL;
    }   
    else {
        struct node *New=(struct node *) malloc (sizeof(struct node));
        for(p1=head;p1->next!=NULL;p1=p1->next);
            p1->next=New;
    }
}
void main() {
    char ch,frm,to;
    printf("\nEnter the string");
    while((ch=getchar())!='\0')
        addnode(ch);
    for(p1=head;p1!=NULL;p1=p1->next)
        printf("\n%c",p1->ch);
}
1
Revaapriyan 28 Май 2017 в 20:19

2 ответа

Я не уверен, что это так ... но вы должны подумать над тем, как освободить выделенный указатель ... как, например, функция свободного списка ...

Вот мой путь.

#include<stdio.h>
    #include<stdlib.h>

    struct node{
        char ch;
        struct node *next;
    };

    struct node * addnode(struct node *head, struct node *p1, char ch) {
        if(head==NULL) {
            printf("......return 2... \r\n");
            head=(struct node *)malloc(sizeof(struct node));
            head->ch=ch;
            head->next=NULL;

            return head;
        }
        else {
            struct node *New=NULL;
            printf("......return ... \r\n");

            New=(struct node *) malloc (sizeof(struct node));
            New->ch = ch;
            New->next=NULL;

            for(p1=head;p1->next!=NULL;p1=p1->next);

            p1->next=New;

            return head;

        }
    }

    void main() {

        char ch,frm,to;
        struct node *head=NULL, *p1=NULL;

        printf("\nEnter the string \n");


        while((ch=getchar())!='q')
            head = addnode(head, p1, ch);

        for(p1=head;p1!=NULL;p1=p1->next)
        {
            printf("\n%c",p1->ch);
        }

    }

Другой.

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    char ch;
    struct node *next;
} *pNODE, NODE;


pNODE addnode2(pNODE head, pNODE p1, char ch) {
    if(head==NULL) {
        printf("......return 2... \r\n");
        head=(pNODE)malloc(sizeof(NODE));
        head->ch=ch;
        head->next=NULL;

        return head;
    }
    else {
        struct node *new=NULL;
        printf("......return ... \r\n");

        new=(pNODE) malloc (sizeof(NODE));
        new->ch = ch;
        new->next=NULL;

        for(p1=head;p1->next!=NULL;p1=p1->next);

        p1->next=new;

        return head;

    }
}

void main() {

    char ch,frm,to;
    pNODE head=NULL;
    pNODE p1=NULL;

    printf("\nEnter the string \n");


    while((ch=getchar())!='q')
        head = addnode2(head, p1, ch);

    for(p1=head;p1!=NULL;p1=p1->next)
    {
        printf("\n%c",p1->ch);
    }

}
0
tommybee 29 Май 2017 в 06:58

Это работало лучше, и я пришел к ошибкам :). И я пропустил ясность указателей там, которые были исправлены здесь ..

#include<stdio.h>
#include<stdlib.h>
struct Node{
    char ch;
    struct Node *next;
};
struct Node head={'\0',NULL};
struct Node *p1=NULL;
void add(char ch){
    if(head.ch=='\0')
        head.ch=ch;
    else{
    struct Node *new=(struct node *)malloc(sizeof(struct Node));
    new->ch=ch;
    for(p1=&head;p1->next!=NULL;p1=p1->next);
    p1->next=new;
    }
}
void main(){
    char c;
    while((c=getchar())!='\n')
        add(c);
    for(p1=&head;p1!=NULL;p1=p1->next)
        printf("%c\n",p1->ch);
}

Но я все еще получаю предупреждение:

Инициализация из несовместимого типа указателя [включено по умолчанию]

struct Node *new=(struct node *)malloc(sizeof(struct Node));
               ^
1
Revaapriyan 29 Май 2017 в 04:27