您的位置:首页 > 职场人生

面试题五: 从尾到头打印链表

2015-08-14 02:11 603 查看
/*
brief: 输入一个链表的头结点,从尾到头反过来打印出每个结点的数值。

*/

#include "iostream"
using namespace std;
//
#include "List.h"
#include "stack"

void PrintListReversingly_Iteratively(ListNode *pHead)
{
std::stack<ListNode*>nodes;

ListNode *pNode = pHead;
while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while(!nodes.empty())
{
pNode = nodes.top();
printf("%d\t", pNode->m_nValue);
nodes.pop();
}
}

void PrintListReversingly_Recursively(ListNode *pHead)
{
if(pHead != NULL)
{
if(pHead->m_pNext != NULL)
{
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t", pHead->m_nValue);
}
}

void Test(ListNode *pHead)
{
PrintList(pHead);
PrintListReversingly_Iteratively(pHead);
printf("\n");
PrintListReversingly_Recursively(pHead);
}

// 1->2->3->4->5

void Test1()
{
printf("\nTest1 begins.\n");
//
ListNode *pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);

ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);

Test(pNode1);
DestroyList(pNode1);

}

// 只有一个结点的链表: 1
void Test2()
{
printf("\nTest2.begins.\n");
//
ListNode* pNode1 = CreateListNode(1);
Test(pNode1);
DestroyList(pNode1);
}

// 空链表
void Test3()
{
printf("\nTest3 begins.\n");
Test(NULL);
}

int main(int argc, char * argv[])
{

Test1();
Test2();
Test3();

system("pause");
system("pause");
return 0;
}
List.h
<pre name="code" class="cpp">
struct ListNode
{
int			m_nValue;
ListNode   *m_pNext;

};

__declspec( dllexport ) ListNode* CreateListNode(int value);	 // 将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
__declspec( dllexport ) void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);
__declspec( dllexport ) void PrintList(ListNode* pHead);
__declspec( dllexport ) void DestroyList(ListNode* pHead);



List.cpp
/*

*/

#include "list.h"
#include "stdio.h"<span style="white-space:pre">			</span>// NULL
//
#include "stdlib.h"

ListNode *CreateListNode(int value)
{
<span style="white-space:pre">	</span>ListNode *pNode = new ListNode;
<span style="white-space:pre">	</span>pNode->m_nValue = value;
<span style="white-space:pre">	</span>pNode->m_pNext = NULL;
<span style="white-space:pre">	</span>//
<span style="white-space:pre">	</span>return pNode;
}

void ConnectListNodes(ListNode *pCurrent, ListNode *pNext)
{
<span style="white-space:pre">	</span>if(pCurrent == NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>printf("Error to connect two nodes.\n");
<span style="white-space:pre">		</span>exit(1);// exit(1)表示异常退出.这个1是返回给操作系统的。
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>pCurrent->m_pNext = pNext;
}

void PrintList(ListNode *pHead)
{
<span style="white-space:pre">	</span> printf("PrintList starts.\n");

<span style="white-space:pre">	</span> ListNode *pNode = pHead;
<span style="white-space:pre">	</span> while(pNode != NULL)
<span style="white-space:pre">	</span> {
<span style="white-space:pre">		</span> printf("%d\t", pNode->m_nValue);
<span style="white-space:pre">		</span> pNode = pNode->m_pNext;
<span style="white-space:pre">	</span> }
<span style="white-space:pre">	</span> printf("\nPrintList ends.\n");
}

void DestroyList(ListNode* pHead)
{
<span style="white-space:pre">	</span>ListNode *pNode = pHead;
<span style="white-space:pre">	</span>while(pNode != NULL)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>pHead = pHead->m_pNext;
<span style="white-space:pre">		</span>delete pNode;
<span style="white-space:pre">		</span>pNode = pHead;
<span style="white-space:pre">	</span>}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: