#include <iostream>
#include <cstring>

struct Student {
  int id;
  char* name;
  Student* next;
  Student* prev;
}; 

Student* createStudent(const int id, const char* name, Student* pNext, Student* pPrev) {
  struct Student* pStudent = new Student;
  pStudent->id = id;
  pStudent->name = new char[strlen(name)];
  strcpy(pStudent->name, name);
  pStudent->next = pNext;
  pStudent->prev = pPrev;
  return pStudent;
}

Student* getLast(Student* pCurrent) {
    while(pCurrent->next != NULL) {
      pCurrent = pCurrent->next;
    }
	return pCurrent;
}

void insertFirst(Student*& pHead, const int id, const char* name) {
  if(pHead == NULL) {
      pHead = createStudent(id, name, NULL, NULL);
  } else {
      pHead = createStudent(id, name, pHead, NULL);
      pHead->next->prev = pHead;
  }
}

void append(Student*& pHead, const int id, const char* name){
  if(pHead == NULL) {
    pHead = createStudent(id, name, NULL, NULL);
  } else {
    struct Student* pCurrent = pHead;
    while(pCurrent->next != NULL) {
      pCurrent = pCurrent->next;
    }

    pCurrent->next = createStudent(id, name, NULL, pCurrent);
  }
}

void printItem(Student* pItem) {
	if (pItem == NULL) {
		std::cout << "addr: NULL;" << std::endl;
	} else {
    	std::cout << "addr:" << pItem << "; next:"
	    	      << pItem->next << "; prev:"
		          << pItem->prev << "; id:"
		          << pItem->id << "; name:"
		          << pItem->name << ";" << std::endl;
	}
}

int main() {
	Student* pHead = NULL;
	append(pHead, 10, "Hello0");
	append(pHead, 11, "Hello1");
	append(pHead, 11, "Hello2");
	insertFirst(pHead, 10, "Hello-1");

	Student* pCurrent = pHead;
	while (pCurrent != NULL) {
		printItem(pCurrent);
		pCurrent = pCurrent->next;
	}
	std::cout << std::endl;
	return 0;
}