2

このサイトからコードを読みました: http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-CC、しかしそれは私にセグメンテーション違反を引き起こし、私はそれをよく理解していません.

*構造体に変更しました

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ガイズ「^」!文字 " (ASCII 34) を printf 文字列に入れる方法を偶然にも知っていますか? (たとえば、printf("Print this "sentence"); を実行すると、文にエラーが発生するため、別のセットをキャストしました"" 内部 "".Thx たくさん。

4

4 に答える 4

3

まず、最初の挿入時にヘッド ポインターを設定できません。これは単純なヘッド チェックで実行できますが、挿入ループが正しく設定されている場合は必要ありません。第二に、あなたはメモリをリークしています。これは Java ではありません。動的割り当てのアドレスを保持するポインターを上書きすることは、メモリをウィンドウから投げ出すことと同じです。

if (head == NULL)これは、挿入コードに特別なケースを埋めずにこれを行う 1 つの方法です。一般的な意見に反して、次のようにすれば特別なケースは必要ありません。

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);
}

挿入を行う前に NULL に初期化されていることを確認headしてください。更新された投稿を見ると、正しく行っているように見えます。

最後に、C プログラムで結果をキャストしないでください。malloc()

于 2013-09-29T09:35:50.990 に答える
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;
   }
}

EDIThead : この関数は、 nullであっても、どのような場合でも処理する必要があります。(リストが空の場合)

于 2013-09-29T09:31:19.057 に答える
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;
于 2013-09-29T09:28:05.963 に答える
0

参照したリンクを参照してください。テスト ファイルhttp://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=24684もあります。このエラーが発生する理由がわかります。ヘッドが null であるかどうかを最初にチェックし、最初の要素にスペースを割り当てます。

引用符

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;
            }
   }
于 2013-09-29T09:48:42.137 に答える