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

struct node {
    char str[200];
    int nn;
    struct node* next;
};

int number;
struct node* start=NULL;
struct node* current;
//function to insert into the list 

void insert() {
    struct node* n;
    n=(struct node*)malloc(sizeof(struct node));
    n->str=malloc(sizeof(char) * 1000);
    printf("please enter the data that you would like to insert: ");
    gets(n->str);
    printf("asdasdasdasd");
    n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

    }

    printf("done\n");
}

void display() {
    current=start;
    int i=0;
    while( current->next!=NULL ) {
        printf("node%d= %s\n",++i,current->str);
        current=current->next;

    }
    printf("this the end");
}


int main() {
    char c;
    int input;

    do {
        printf("Select from the following options:\n"
           "1.Display list\n"
           "2.Add to list\n"
           "3.delete from list\n");

        scanf("%d",&input);
        switch (input) {
            case 1: display(); break;
            case 2: insert(); break;
      //    case 3: delete(); break;
            default : printf("Please select 1 , 2 or 3\n");
        }
        printf( "would you like to continue?(y/n)\n");
        scanf("%s",&c);
    } while(c=='y');

    return 0;
}

这在插入函数中给了我一个错误,A SEGMENTATION FAULT!

我尝试了一些东西,但我只是没有得到清晰的画面。我对指针有点弱,实际上很困惑!

请告诉我我做错了什么来帮助我。忘记我的链表逻辑,让它错了。我只想知道为什么会发生分段错误!

4

6 回答 6

3

由于您没有告诉我们发生段错误的行,我只能猜测。

至少这些台词对我来说听起来很假:

if( start==NULL ) {
    start->next=n;
    current=n;
}

您确定要取消引用startNULL?这就是你正在做的事情start->next。取消引用NULL会导致段错误。

也许这会按您期望的方式工作:

if( start==NULL ) {
    start=n;
    current=n;
}

所以基本上,如果start还没有定义,定义它,它也成为你当前的项目。

于 2012-08-18T20:45:18.337 回答
3

你有很多错误,但你的崩溃是因为你没有分配开始

n->next=NULL;
    if( start==NULL ) {
        start->next=n;
        current=n;
    }
    else {

    current->next=n;
    current=n;

你问 start 是否为空,如果是,你尝试通过调用 start->next 来读取它。你需要先分配它。

于 2012-08-18T20:50:05.080 回答
2
  1. 编译错误
    n->str=malloc(sizeof(char) * 1000);

    这是在常量上重新分配地址!!!!!您正在更改数组的地址???

  2. 执行概率为 25% 的危险函数。

    gets(n->str);

  3. 在空指针处设置值!!!

    struct node* start=NULL;....
    start->next=n;

工作代码示例

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

    struct node {
        char *str;
        int nn;
        struct node* next;
        };

    int number;
    struct node* start=NULL;
    struct node* current;
    //function to insert into the list

    void insert() {
        struct node* n;
        n=(struct node*)malloc(sizeof(struct node));
        n->str=(char*)malloc(sizeof(char) * 1000);
        printf("please enter the data that you would like to insert: ");
        scanf("%s",n->str);
        printf("asdasdasdasd");
        n->next=NULL;
        if( start==NULL ) {
            //start->next=n;
            current=n;
        }
        else {

        current->next=n;
        current=n;

        }

        printf("done\n");
    }

    void display() {
        current=start;
        int i=0;
        while( current->next!=NULL ) {
            printf("node%d= %s\n",++i,current->str);
            current=current->next;

        }
        printf("this the end");
        }


    int main() {

        char c;
        int input;

        do {
            printf("Select from the following options:\n"
               "1.Display list\n"
               "2.Add to list\n"
               "3.delete from list\n"
               );


        scanf("%d",&input);
        switch (input) {

            case 1: display(); break;
            case 2: insert(); break;
        //    case 3: delete(); break;
            default : printf("Please select 1 , 2 or 3\n");

            }
        printf( "would you like to continue?(y/n)\n");
        scanf("%s",&c);
        }while(c=='y');

    return 0;
    }
于 2012-08-18T20:52:04.737 回答
2

您应该使用调试器(而不是我们)来查找有关问题的更多信息。

例如 gdb(GNU 调试器)。

于 2012-08-18T20:55:47.267 回答
1
if( start==NULL ) {
        start->next=n;
        current=n;
    }

我认为你在这里有一个小问题;-)

于 2012-08-18T20:44:45.860 回答
1

下一行不安全:

   scanf("%s",&c);

scanf 添加终止空字符 '\0' 在您的情况下会破坏堆栈。

于 2012-08-18T20:51:29.707 回答