Не могу добавить узел в конец моего связанного списка в C - PullRequest
0 голосов
/ 03 сентября 2018

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

Моя текущая функция append установит узел в конец списка, но после того, как я добавлю один узел и попытаюсь добавить другой, я получу segmentation fault, как если бы программа не могу добавить новый last, когда уже есть другой, я сейчас пытаюсь его отладить, но не могу найти точную строку / ии с ошибкой.

// self-referential structure                       
struct listNode {                                      
   char *data; // each listNode contains a character
   int num;
   struct listNode *nextPtr; // pointer to next node
}; 


typedef struct listNode ListNode; // synonym for struct listNode
typedef ListNode *ListNodePtr; // synonym for ListNode*

void append(ListNodePtr *sPtr, char *value, int valore)
 {  /* 1. allocate node */

    ListNodePtr lastNode = malloc(sizeof(ListNode)+1);

    ListNode *last = *sPtr; 

    /* 2. put in the data  */
    last->data= malloc(strlen(value));
    strcpy(last->data, value);
    last->num = valore;

    /* 3. This new node is going to be the last node, so make next 
          of it as NULL*/
    lastNode->nextPtr = NULL;

    /* 4. If the Linked List is empty, then make the new node as head */
    if (*sPtr == NULL)
    {
       *sPtr = lastNode;
       return;
    }  

    /* 5. Else traverse till the last node */
    while (last->nextPtr != NULL)
        last = last->nextPtr;

    /* 6. Change the next of last node */
    last->nextPtr = lastNode;

 }

// insert a new value into the list in sorted order
void insert(ListNodePtr *sPtr, char *value, int valore)
{ 
   ListNodePtr newPtr = malloc(sizeof(ListNode)+1); // create node

   if (newPtr != NULL) { // is space available
      newPtr->data= malloc(strlen(value));
      strcpy(newPtr->data, value);
      newPtr->num = valore;
      newPtr->nextPtr = NULL; // node does not link to another node
      ListNodePtr previousPtr = NULL;
      ListNodePtr currentPtr = *sPtr;
      // loop to find the correct location in the list       
      while (currentPtr != NULL && value > currentPtr->data) {
         previousPtr = currentPtr; // walk to ...               
         currentPtr = currentPtr->nextPtr; // ... next node 
      }                                          
      // insert new node at beginning of list
      if (previousPtr == NULL) { 
         newPtr->nextPtr = *sPtr;
         *sPtr = newPtr;
      } 
      else { // insert new node between previousPtr and currentPtr
         previousPtr->nextPtr = newPtr;
         newPtr->nextPtr = currentPtr;
      } 
   } 
   else {
      printf("%s not inserted. No memory available.\n", value);
   } 
}

1 Ответ

0 голосов
/ 03 сентября 2018

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

Зачем использовать синоним, если вы не согласны?

ListNodePtr lastNode = malloc(sizeof(ListNode)+1);

ListNode *last = *sPtr; 

Почему +1?

ListNodePtr lastNode = malloc(sizeof(ListNode)+1)

Это:

ListNode *last = *sPtr; 

/* 2. put in the data  */
last->data= malloc(strlen(value));
strcpy(last->data, value);
last->num = valore;

Вы перезаписываете значения узла, отправленного этому методу. Вероятно, намеревался использовать lastNode

Теперь вам нужно + 1

last->data= malloc(strlen(value));

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

...