2013-09-29 5 views
2

Я прочитал код с этого сайта: http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C, но это дало мне ошибку сегментации, и я не совсем понял.Вставка со спины: Связанный список

* Я изменил его к моим структурам

struct Node 
{ 
    int type; 
    char cmd[256]; 
    struct Node *next; 
}; 

struct Node *head = NULL; 

void insert(int val, char arr[]) 
{ 
    struct Node *temp1 = (struct Node*)malloc(sizeof(struct Node)); 
    struct Node *temp2 = (struct Node*)malloc(sizeof(struct Node)); 
    temp1 = head; 
    while(temp1->next != NULL) 
     temp1 = temp1->next; 

    temp2->type = val; 
    strcpy(temp2->cmd, arr); 

    temp2->next = NULL; 
    temp1->next = temp2; 
} 

Что не так с этим кодом?

OK, эта проблема решена. Thx Guyz '^'! Знаете ли вы, что когда-либо помещаете charcters (ASCII 34) в строку printf? (Например, если я делаю printf («Распечатать это предложение»), это дало бы мне ошибку в предложении, разрезаю я наложил еще один набор .. «» внутри «» Thx кучи

+0

Какая линия вызвала SEG-вины? –

+0

Вам не нужно выделять память для 'temp1' или у вас будет утечка памяти. 'struct Node * temp1 = head' в порядке. – Michael

+0

Можете ли вы рассказать нам о содержимом 'struct Node'? (и что является членом 'cmd') – Michael

ответ

1

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

void insert(int val, char arr[]) 
{ 
    struct Node *temp2 = malloc(sizeof(struct Node)); 
    temp2->type = val; 
    strcpy(temp2->cmd, arr); 
    temp2->next = NULL; 

    if (head == NULL) { 
     //list is empty, head must points on the created node 
     head = temp2; 
    } 
    else { 
     struct Node *temp1 = head; 

     while(temp1->next != NULL) 
     temp1 = temp1->next; 

     temp1->next = temp2; 
    } 
} 

EDIT: Теперь эта функция должна обрабатывать любой случай, даже если head имеет значение NULL. (когда список пуст)

+0

OK, эта проблема решена. Спасибо! Знаете ли вы, что когда-либо помещаете charcters (ASCII 34) в строку printf? (Например, если я делаю printf («Распечатать это предложение»), это дало бы мне ошибку в предложении, разрезаю я наложил еще один набор "" внутри a "". – LarsChung

+0

@LarsChung да просто добавить escape-символ: 'printf (« Распечатать это предложение »);' – Michael

+0

nvm, я получил его, я могу сделать% c и поместить значение ascii там .xx anyways '^' – LarsChung

1

вы должны инициализировать head перед запуском первой вставки:

/* This should go in main or some init function, before the first insert */ 
head = (struct Node *)malloc(sizeof(struct Node)); 
head->next = NULL; 
+0

Когда я делаю вставку спереди, и я оставляю голову так, как она есть в моем вопросе, она работает нормально, по какой-либо причине, ее нужно сделать так, чтобы она была вставлена ​​со спины? – LarsChung

+0

@LarsChung из-за 'while (temp1-> next! = NULL)' check (который пытается разыменовать нулевой указатель). Я подозреваю, что ваша передняя вставка не пытается получить доступ к «head-> next» – SheetJS

+0

. О, да, это как-то исправлено, но есть еще какая-то логическая ошибка. Я думаю, я получаю дополнительный узел .... Я поставил три строки , но он дает мне 4 узла ... – LarsChung

3

Во-первых, вы не можете установить указатель на начальную вставку. Это можно сделать с помощью простой проверки головы, хотя это не требуется, если петля ввода настроена правильно. Во-вторых, вы теряете память. Это не Java. переписывание указателя, содержащего адрес динамического выделения, так же хорошо, как выброс памяти из окна.

Это один из способов сделать это, не зарывая специальный код if (head == NULL) в ваш код вставки. Вопреки распространенному мнению, вам не нужен этот особый случай, если вы делаете это так:

void insert(int val, char arr[]) 
{ 
    struct Node **pp = &head; 
    while (*pp) 
     pp = &(*pp)->next; 

    *pp = malloc(sizeof(**pp)); 
    (*pp)->next = NULL; 
    (*pp)->type = val; 
    strcpy((*pp)->cmd, arr); 
} 

Просто убедитесь, что head инициализируется NULL перед выполнением каких-либо вставок, которые, похоже, что вы делаете правильно глядя на ваш обновленный пост.

Наконец, don't cast malloc() results in C programs.

0

Смотрите ссылку, которую называют, там также есть тестовый файл, http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=24684, он расскажет, почему вы получите эту ошибку, когда вставка со спины, он сначала проверить голову, если это null и выделить пространство для первого элемента.

Blockquote

1 #include<iostream> 
    2 
    3 using namespace std; 
    4 
    5 typedef struct node 
    6 { 
    7  int data; // will store information 
    8  node *next; // the reference to the next node 
    9 }; 
10 
11 
12 int main() 
13 { 
14  node *head = NULL; //empty linked list 
15  int info = 0, node_number = 0, counter = 0; 
16  char ch; 
17 
18  do{ 
19   cout<<"\n\n"; 
20   cout<<"0.Quit\n"; 
21   cout<<"1.Insert at first\n"; 
22   cout<<"2.Traverse\n"; 
23   cout<<"3.Insert at last\n"; 
24   cout<<"4.Insert after specified number of node\n"; 
25   cout<<"5.Delete at first node\n"; 
26   cout<<"6.Delete at last node\n"; 
27   cout<<"7.Delete specified number of node\n"; 
28   cout<<"8.Sort nodes\n"; 
29 
30   cout<<"Enter your choice: "; 
31   cin>>ch; 
32 
33  switch(ch) 
34  { 
35 
36  case '0': break; 
37 
38  case '1': .... 

    ..... case '3':{ 
      **// check linked list is empty** 
      if(head==NULL) 
      { 
       cout<<"ENTER ANY NUMBER:"; 
       cin>>info;      // take input data 
       cout<<"Input data: "<<info; 

       node *temp;      // create a temporary node 
       temp = (node*)malloc(sizeof(node)); // allocate space for node 
       temp->data = info;    // store data(first field) 
       temp->next = NULL;    // second field will be null 
       head = temp;     // transfer the address of 'temp' to 'head' 
       counter++; 
      } 

      else 
      { 
       cout<<"ENTER ANY NUMBER:"; 
       cin>>info;      // take input data 
       cout<<"Input data: "<<info; 
       node *temp1;      // create a temporary node 
       temp1=(node*)malloc(sizeof(node)); // allocate space for node 
       temp1 = head;     // transfer the address of 'head' to 'temp' 
       while(temp1->next!=NULL)   // go to the last node 
        temp1 = temp1->next;   //tranfer the address of 'temp->next' to 'temp' 

       node *temp;     // create a temporary node 
       temp = (node*)malloc(sizeof(node));// allocate space for node 
       temp->data = info;    // store data(first field) 
       temp->next = NULL;    // second field will be null(last node) 
       temp1->next = temp;    // 'temp' node will be the last node 
       break; 
      } 
    } 
+0

И это в вопросе, помеченном как ** C **, потому что ....? – WhozCraig

+0

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

+0

вам лучше написать свою функцию для обработки двух двух ситуаций: AddToHead() и AddToBack(), а не просто insert() – scotthuan

Смежные вопросы