#include<iostream>
using namespace std;
class SingleList
{
public:
int data;
SingleList *pNext;
};
SingleList* InitSingleList();
SingleList* CreateNode(int data);
void InsertHeadNode(SingleList* pHead, int data);
void InsertTailNode(SingleList *pHead, int data);
void InsertToTarget(SingleList *pHead, int posData, int data);
void DeleteHeadNode(SingleList *pHead);
void DeleteTailNode(SingleList *pHead);
void DeleteTargetNode(SingleList *pHead, int data);
void PrintList(SingleList* pHead);
void SortList(SingleList *pHead);
void ClearList(SingleList *pHead);
void Menu();
int main()
{
SingleList *pHead=InitSingleList();
while (1)
{
system("cls");
Menu();
char choic = getchar();
switch (choic)
{
case '1':
int data;
cout << "输入要插入的数据" << endl;
cin >> data;
InsertHeadNode(pHead,data);
system("pause"); break;
case '2':
cout << "输入要插入的数据" << endl;
cin >> data;
InsertTailNode(pHead,data);
system("pause"); break;
case '3':
int posData;
cout << "输入在哪个数据之后插入" << endl;
cin >> posData;
cout << "输入要插入的数据" << endl;
cin >> data;
InsertToTarget(pHead, posData, data);
system("pause"); break;
case '4':
DeleteHeadNode(pHead);
system("pause"); break;
case '5':
DeleteTailNode(pHead);
system("pause"); break;
case '6':
cout << "输入要删除的数据" << endl;
cin >> data;
DeleteTargetNode(pHead, data);
system("pause"); break;
case '7':
SortList(pHead);
system("pause"); break;
case '8':
ClearList(pHead);
system("pause");
break;
case '9':
PrintList(pHead);
system("pause"); break;
default:
break;
}
while (getchar() != '\n') {}
}
system("pause");
return 0;
}
SingleList* InitSingleList() //创建头结点,头结点的指针域就是头指针,用来进行操作链表
{
//int *p=new int ;
//int *pArr=new int[10]{0,1,2,3,4,5,6,7,8,9};
SingleList* pHead = new SingleList; //new直接返回的就是申请类型的指针,不需要在进行强转了
if (pHead == nullptr)
{
cout << "申请内存失败" << endl;
exit(0);
system("pause");
}
pHead->pNext = nullptr;
return pHead;
}
SingleList* CreateNode(int data) //创建新结点
{
SingleList* pNew = new SingleList;
if (pNew == nullptr)
{
cout << "申请内存失败" << endl;
exit(0);
system("pause");
}
pNew->data = data;
}
void InsertHeadNode(SingleList* pHead, int data)//头插法插入一个新结点
{
SingleList *pNew = CreateNode(data);
pNew->pNext = pHead->pNext;
pHead->pNext = pNew;
}
void PrintList(SingleList* pHead) //打印链表
{
SingleList* pTemp = pHead->pNext;
if (pTemp == nullptr)
{
cout << "链表为空" << endl;
return;
}
while (pTemp!=nullptr)
{
cout << pTemp->data << "\t";
pTemp = pTemp->pNext;
}
cout << endl;
}
void InsertTailNode(SingleList *pHead, int data) //在尾部插入一个新结点
{
SingleList *pNew = CreateNode(data);
SingleList* pTemp = pHead;
while (pTemp->pNext!= nullptr)
{
pTemp = pTemp->pNext;
}
pTemp->pNext= pNew;
pNew->pNext = nullptr;
cout << "在尾部插入结点执行成功" << endl;
}
//在posData这个数据之后插入data
void InsertToTarget(SingleList *pHead, int posData, int data)
{
SingleList *pTemp = pHead;
SingleList *pNew = CreateNode(data);
while (pTemp->data!=posData)
{
if (pTemp->pNext == nullptr)
{
cout << "没有找到指定位置" << endl;
system("pause");
return;
}
pTemp = pTemp->pNext;
}
pNew->pNext = pTemp->pNext;
pTemp->pNext = pNew;
cout << "在指定位置插入结点成功" << endl;
}
//删除头结点
void DeleteHeadNode(SingleList *pHead)
{
SingleList *pTemp = pHead->pNext;
pHead->pNext = pTemp->pNext;
delete pTemp;
pTemp = nullptr;
cout << "删除头结点成功" << endl;
}
//删除尾结点
void DeleteTailNode(SingleList *pHead)
{
SingleList *pTemp = pHead;
SingleList *p = pTemp;
while (pTemp->pNext!= nullptr)
{
p = pTemp;
pTemp = pTemp->pNext;
}
p->pNext = nullptr;
delete pTemp;
pTemp = nullptr;
cout << "删除尾结点成功" << endl;
}
//删除指定结点data
void DeleteTargetNode(SingleList *pHead, int data)
{
SingleList *pTemp = pHead;
SingleList *p = pTemp;
while (pTemp->data != data)
{
if (pTemp->pNext == nullptr)
{
cout << "没有找到指定位置" << endl;
system("pause");
return;
}
p = pTemp;
pTemp = pTemp->pNext;
}
p->pNext = pTemp->pNext;
delete pTemp;
pTemp = nullptr;
cout << "删除指定结点成功" << endl;
}
//将结点按从小到大的顺序进行排序
void SortList(SingleList *pHead)
{
for (SingleList *pi = pHead->pNext; pi->pNext != nullptr; pi = pi->pNext)
{
for (SingleList *pj = pi; pj!= nullptr; pj = pj->pNext)
{
if (pi->data > pj->data)
{
int temp = pi->data;
pi->data = pj->data;
pj->data = temp;
}
}
}
}
void ClearList(SingleList *pHead)
{
SingleList *pTemp = pHead;
SingleList *p=pTemp;
while (pTemp != NULL)
{
//delete p; //不行,这样的话p和pTemp的指向都为空了,那么还怎么进行指向下一个操作呢
//p = nullptr;
p = pTemp;
pTemp = pTemp->pNext;
delete p; //必须在指向下一个结点之后,才可以删除上一个结点,不然就无法指向下一个结点了
p = nullptr;
}
pHead->pNext = nullptr;
cout << "链表已清空" << endl;
}
void Menu()
{
cout << " 1、在表头插入数据" << endl;
cout << " 2、在表尾插入数据" << endl;
cout << " 3、在指定位置插入数据" << endl;
cout << " 4、删除头结点" << endl;
cout << " 5、删除尾结点" << endl;
cout << " 6、删除指定结点" << endl;
cout << " 7、链表排序" << endl;
cout << " 8、清空链表" << endl;
cout << " 9、打印链表" << endl;
}
单链表的基本操作
最新推荐文章于 2023-08-16 17:51:34 发布