Как добавить вновь созданный узел в список ссылок? - PullRequest
0 голосов
/ 01 июня 2011

вот мой код, я могу только добавить узел в начало списка ссылок, но как добавить хвост к списку ссылок? спасибо

struct recordNode {
  char name[256];  
  char event[128];  /
  float time;
  struct recordNode* next;
};

struct recordNode* temp;
struct recordNode* aRecordPointer = NULL;

struct recordNode* createRecord(char* name, char* event, float time) { 

  temp = (struct recordNode*)malloc(sizeof(struct recordNode));
  strcpy(temp->name, name);
  strcpy(temp->event, event);
  temp->time = time;

  /* link up */
  if (aRecordPointer == NULL) {
     aRecordPointer = temp;
     temp->next = NULL;
  } else {
     temp->next = aRecordPointer;
     aRecordPointer = temp;
  }

  return  aRecordPointer;

}

int main() {

  struct recordNode* record = createRecord("1abc", "abc", 12.25);
  record = createRecord("2abc", "abc", 25.98);
  record = createRecord("3abc", "abc", 52.60);  

}

/* now result:

   3abc abc 12.25
   2abc abc 25.98
   1abc abc 52.60

   needed result:

   1abc abc 52.6
   2abc abc 25.98
   3abc abc 12.25

*/

Ответы [ 3 ]

1 голос
/ 01 июня 2011

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

struct recordNode* createRecord(char* name, char* event, float time){ 
  temp = (struct recordNode*)malloc(sizeof(struct recordNode));
  strcpy(temp->name, name);
  strcpy(temp->event, event);
  temp->time = time;
  temp->next = NULL;

  if (aRecordPointer == NULL) {
     aRecordPointer = temp;
  }
  else {
    struct recordNode* pLast = aRecordPointer;

    /* find the last element */
    while(pLast->next != NULL) {
      pLast = pLast->next;
    }

    /* get linked */
    pLast->next = temp;
  }

  return aRecordPointer;
}
0 голосов
/ 02 июня 2011
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void Traverse();

struct recordNode {
  char name[256];  
  char event[128];  
  float time;
  struct recordNode* next;
};

struct recordNode* temp;
struct recordNode* aRecordPointer = NULL;

struct recordNode* createRecord(char* name, char* event, float time) { 

  struct recordNode * ToTraverseTheLinkedList;
  temp = (struct recordNode*)malloc(sizeof(struct recordNode));
  strcpy(temp->name, name);
  strcpy(temp->event, event);
  temp->time = time;
  temp->next = NULL;

  /* link up */
  if (aRecordPointer == NULL) {
     aRecordPointer = temp;
     //temp->next = NULL;
  }     
    else
    {
    ToTraverseTheLinkedList = aRecordPointer;
    while(ToTraverseTheLinkedList->next != NULL)
        {
             ToTraverseTheLinkedList =  ToTraverseTheLinkedList ->next;

        }
    ToTraverseTheLinkedList->next = temp;
    }
  return  aRecordPointer;

}

int main() {

  createRecord("1abc", "abc", 12.25);
  //Traverse();
  createRecord("2abc", "abc", 25.98);
  createRecord("3abc", "abc", 52.60);  
        Traverse();
}

void Traverse()
{
struct recordNode * temp;
temp = aRecordPointer;
while(temp != NULL)
{
printf("%s\n",temp->name);
printf("%s\n",temp->event);
printf("%f\n",temp->time);
temp = temp->next;
}
}
0 голосов
/ 01 июня 2011

Предполагая, что aRecordPointer является указателем на последний узел, измените ваш код следующим образом:

struct recordNode* createRecord(char* name, char* event, float time) 
{ 
  temp = (struct recordNode*)malloc(sizeof(struct recordNode));
  strcpy(temp->name, name);
  strcpy(temp->event, event);
  temp->time = time;

  //I have added this line as well.
  temp->next = NULL;

  /* link up */
  if (aRecordPointer == NULL) 
  {
     aRecordPointer = temp;
  } 
  else 
  {
     aRecordPointer->next = temp;
     aRecordPointer = temp;
  }
  return aRecordPointer;
}

Также обратите внимание, что у вас всегда должен быть указатель на голову (первый узел), чтобы пройти по связанномусписок позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...