#include <iostream.h>
// 定义结点结构
struct Node
{
int value; // 结点值
Node *pNext; // 指向下一结点的指针
};
// 向pHead指向的链表表头加入数据,并返回新的表头指针
Node *Add(Node *pHead, int value)
{
Node *pTemp = new Node;
pTemp->value = value;
pTemp->pNext = pHead;
cout<<"操作完成!"<<endl;
return pTemp;
}
// 将pHead指向的链表第post个数据删除,并返回新的表头指针
Node *Delete(Node *pHead, int post)
{
if (NULL == pHead)
{
cout<<"链表为空"<<endl;
return pHead;
}
Node *pTemp = pHead->pNext; // pTemp指向头结点的下一结点
if (0 == post)
{
// 第一个数据直接删除
delete pHead;
cout<<" 数据已删除"<<endl;
return pTemp;
}
Node *pReturn = pHead;
int count = 1;
while (NULL != pTemp)
{
if (count == post) // 找到第post个,删除
{
pHead->pNext = pTemp->pNext;
delete pTemp;
cout<<" 数据已删除"<<endl;
return pReturn;
}
count++; // 查找数据加一
pHead = pTemp; // pHead后移一个
pTemp = pHead->pNext; // pTemp指向pHead结点的下一结点
}
cout<<" 链表长度不足"<<endl;
return pReturn;
}
void Print(Node *pHead)
{
cout<<"*****链表数据*****"<<endl;
int count = 0;
while (NULL != pHead)
{
cout<<count++<<"). "<<pHead->value<<endl;
pHead = pHead->pNext;
}
}
// 删除所有数据
void DeleteAll(Node *pHead)
{
Node *pTemp = pHead;
while (NULL != pTemp)
{
pHead = pTemp->pNext;
delete pTemp;
pTemp = pHead;
}
}
// 打印菜单并等待用户输入
int PrintMenu()
{
cout<<"======单向链表演示程序======="<<endl;
cout<<"0. 退出"<<endl;
cout<<"1. 增加"<<endl;
cout<<"2. 删除"<<endl;
cout<<"3. 遍历(打印)"<<endl;
cout<<" 请选择: ";
int userInput;
cin>>userInput;
return userInput;
}
void main()
{
Node *pHead = NULL; // 链表头指针
int userInput = -1;
int userValue = 0;
while (userInput != 0)
{
switch(userInput) {
case 1:
cout<<"请输入增加的数据:";
cin>>userValue;
pHead = Add(pHead, userValue);
break;
case 2:
cout<<"请输入要删除数据位置(0开始计算):";
cin>>userValue;
pHead = Delete(pHead, userValue);
break;
case 3:
Print(pHead);
break;
default:
break;
}
userInput = PrintMenu();
}
DeleteAll(pHead); // 退出程序要删除所有释放空间
}