- #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; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnN0cnVjdCBTdHVkZW50IHsKICBpbnQgaWQ7CiAgY2hhciogbmFtZTsKICBTdHVkZW50KiBuZXh0OwogIFN0dWRlbnQqIHByZXY7Cn07IAoKU3R1ZGVudCogY3JlYXRlU3R1ZGVudChjb25zdCBpbnQgaWQsIGNvbnN0IGNoYXIqIG5hbWUsIFN0dWRlbnQqIHBOZXh0LCBTdHVkZW50KiBwUHJldikgewogIHN0cnVjdCBTdHVkZW50KiBwU3R1ZGVudCA9IG5ldyBTdHVkZW50OwogIHBTdHVkZW50LT5pZCA9IGlkOwogIHBTdHVkZW50LT5uYW1lID0gbmV3IGNoYXJbc3RybGVuKG5hbWUpXTsKICBzdHJjcHkocFN0dWRlbnQtPm5hbWUsIG5hbWUpOwogIHBTdHVkZW50LT5uZXh0ID0gcE5leHQ7CiAgcFN0dWRlbnQtPnByZXYgPSBwUHJldjsKICByZXR1cm4gcFN0dWRlbnQ7Cn0KClN0dWRlbnQqIGdldExhc3QoU3R1ZGVudCogcEN1cnJlbnQpIHsKICAgIHdoaWxlKHBDdXJyZW50LT5uZXh0ICE9IE5VTEwpIHsKICAgICAgcEN1cnJlbnQgPSBwQ3VycmVudC0+bmV4dDsKICAgIH0KCXJldHVybiBwQ3VycmVudDsKfQoKdm9pZCBpbnNlcnRGaXJzdChTdHVkZW50KiYgcEhlYWQsIGNvbnN0IGludCBpZCwgY29uc3QgY2hhciogbmFtZSkgewogIGlmKHBIZWFkID09IE5VTEwpIHsKICAgICAgcEhlYWQgPSBjcmVhdGVTdHVkZW50KGlkLCBuYW1lLCBOVUxMLCBOVUxMKTsKICB9IGVsc2UgewogICAgICBwSGVhZCA9IGNyZWF0ZVN0dWRlbnQoaWQsIG5hbWUsIHBIZWFkLCBOVUxMKTsKICAgICAgcEhlYWQtPm5leHQtPnByZXYgPSBwSGVhZDsKICB9Cn0KCnZvaWQgYXBwZW5kKFN0dWRlbnQqJiBwSGVhZCwgY29uc3QgaW50IGlkLCBjb25zdCBjaGFyKiBuYW1lKXsKICBpZihwSGVhZCA9PSBOVUxMKSB7CiAgICBwSGVhZCA9IGNyZWF0ZVN0dWRlbnQoaWQsIG5hbWUsIE5VTEwsIE5VTEwpOwogIH0gZWxzZSB7CiAgICBzdHJ1Y3QgU3R1ZGVudCogcEN1cnJlbnQgPSBwSGVhZDsKICAgIHdoaWxlKHBDdXJyZW50LT5uZXh0ICE9IE5VTEwpIHsKICAgICAgcEN1cnJlbnQgPSBwQ3VycmVudC0+bmV4dDsKICAgIH0KCiAgICBwQ3VycmVudC0+bmV4dCA9IGNyZWF0ZVN0dWRlbnQoaWQsIG5hbWUsIE5VTEwsIHBDdXJyZW50KTsKICB9Cn0KCnZvaWQgcHJpbnRJdGVtKFN0dWRlbnQqIHBJdGVtKSB7CglpZiAocEl0ZW0gPT0gTlVMTCkgewoJCXN0ZDo6Y291dCA8PCAiYWRkcjogTlVMTDsiIDw8IHN0ZDo6ZW5kbDsKCX0gZWxzZSB7CiAgICAJc3RkOjpjb3V0IDw8ICJhZGRyOiIgPDwgcEl0ZW0gPDwgIjsgbmV4dDoiCgkgICAgCSAgICAgIDw8IHBJdGVtLT5uZXh0IDw8ICI7IHByZXY6IgoJCSAgICAgICAgICA8PCBwSXRlbS0+cHJldiA8PCAiOyBpZDoiCgkJICAgICAgICAgIDw8IHBJdGVtLT5pZCA8PCAiOyBuYW1lOiIKCQkgICAgICAgICAgPDwgcEl0ZW0tPm5hbWUgPDwgIjsiIDw8IHN0ZDo6ZW5kbDsKCX0KfQoKaW50IG1haW4oKSB7CglTdHVkZW50KiBwSGVhZCA9IE5VTEw7CglhcHBlbmQocEhlYWQsIDEwLCAiSGVsbG8wIik7CglhcHBlbmQocEhlYWQsIDExLCAiSGVsbG8xIik7CglhcHBlbmQocEhlYWQsIDExLCAiSGVsbG8yIik7CglpbnNlcnRGaXJzdChwSGVhZCwgMTAsICJIZWxsby0xIik7CgoJU3R1ZGVudCogcEN1cnJlbnQgPSBwSGVhZDsKCXdoaWxlIChwQ3VycmVudCAhPSBOVUxMKSB7CgkJcHJpbnRJdGVtKHBDdXJyZW50KTsKCQlwQ3VycmVudCA9IHBDdXJyZW50LT5uZXh0OwoJfQoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9