односвязный метод головы и хвоста списка? - PullRequest
0 голосов
/ 24 октября 2018

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

Обновление: я пытался написать какой-то код в своей функции добавления, не отсортировал его, но это таккак выглядит?

ИСТОЧНИК КОДА

typedef struct {
    char car_model[32],car_name[32];

} CarObjects;

typedef struct myNode{

    struct myNode* next;
    CarObjects* data;

} MyList;

//initialize list
void declareList(MyList* someList){
    someList->next = NULL;
}

void insertElementByTitle(MyList* someList, CarObjects* someCar){

    //first case adding to an empty list.
    if(someList == NULL){
        someList = malloc(sizeof(MyList));
        someList->data = someCar;
        someList->next = NULL;
    }
//END OF first case adding to an empty list.

//make thee list's head and tail node, point to the first element since its an empty list
    someList->head = someList;
    someList->tail = someList->head;


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

    someList->next = malloc(sizeof(MyList));
    someList = someList->next;
    someList->data = newBook;
    someList->next = NULL;


}


int main(){


   MyList* listHead= NULL;
   MyList* listTail= NULL;


   //Somehow add an element to the list



   return 0;
}

1 Ответ

0 голосов
/ 24 октября 2018

Сначала правильно определите свою структуру.

typedef struct car{
char car_model[32],car_name[32];
};

typedef struct myList{
myList * next;
car * carObject;
};

Теперь вы пытаетесь вставить в качестве метода сортировки вставок.

void insertElementByTitle(MyList* someList, CarObjects* someCar){
\\I assume someList is pointing the head of the linked list
\\One more assumption that, the Linked List is already sorted and need to inset
\\someCar in the correct position.
MyList *secondPointer = someList->next;
while(secondPointer != null)
{
     if(ifCarIsInBetweenSomeListAndSecondPointer(someList,secondPointer,someCar))
     {
      someList->next = newNode(someCar);
      someList->next->next=secondPointer;
      break;
     }
  someList = secondPointer; secondPointer = secondPointer->next;
}
if(secondPointer == null)
{
     someList->next = newNode(someCar);
}
}

Теперь вам нужны две функции

myNode* newNode(car * someCar);
bool ifCarIsInBetweenSomeListAndSecondPointer(myNode *someList,myNode *secondPointer,car *someCar);

myNode* newNode(car * someCar){
myNode * t =(struct myNode*)malloc(sizeof(struct myNode));
t->carObject = someCar;
t->next= null;
return t;
}

bool ifCarIsInBetweenSomeListAndSecondPointer(myNode *someList,myNode *secondPointer,car *someCar){
if( (strcmp(someList->carObject->car_name,someCar->carObject)<0) &&(strcmp(someCar->carObject,secondPointer->carObject->car_name)<0))
          return true;
return false;
}

См. Онлайн-ссылку, напримеркак связанный с geeksforgeeks список , чтобы лучше понять.

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