完成创建单向链表,实现正序,倒序输出,以及插入和删除某一结点。
#include <iostream>
#include <stack> //同理队列:#include <queue>
using namespace std; //std定义了C++标准库中的函数或对象
//链表的结点定义
struct List
{
int data;
List *next;
};
//创建列表
List *createlist(int n) //创建含有n个结点的链表,该函数的返回值是指向List型结点的指针,因此用List,用*
{
List *head, *pnew;
pnew=new List; //为头结点开辟空间
pnew->data=0;
pnew->next=NULL;
head=pnew; //创建头结点
for (int i=1;i<n;i++)
{
pnew->next=new List; //为下一结点开辟空间
pnew->next->data=i;
pnew->next->next=NULL;
pnew=pnew->next;
}
return head;
}
//正序输出链表
void output(List *head, int n)
{
List *ptemp;
ptemp=head;
for (int i=0;i<n;i++) //或while (p) 即p不为空,不需知道链表的长度信息
{
cout<<ptemp->data<<" "<<endl;
ptemp=ptemp->next;
}
}
//用栈实现倒序打印链表(先入后出) 或者用递归来实现
void inverse(List *head)
{
stack<List*> nodes;
List *pNode=head;
while (pNode!=NULL)
{
nodes.push(pNode);
pNode=pNode->next;
}
while(!nodes.empty())
{
pNode=nodes.top(); //取栈顶元素
cout<<pNode->data<<"\n";
nodes.pop(); //弹出栈顶元素
}
}
//在链表中间第x个结点后插入新元素99
void insert(List *head, int x, int m)
{
List *pNode=head;
int count=0;
while(pNode!=NULL)
{
if (count==x-1)
{
List *ptemp=pNode->next; //记录插入结点的后一结点
pNode->next=new List; //建立新结点
pNode->next->data=m;
pNode->next->next=ptemp;
}
pNode=pNode->next;
count++;
}
}
//删除第x个结点
List *Delete(List *head, int x)
{
List *pNode=head;
int count=0;
if (x==1) //删除头结点
{
cout<<"删除头结点";
pNode=head->next; //pNode指向第二个结点,跳过头结点
delete head;
head=pNode;
}
else
while(pNode!=NULL)
{
if(count==x-2)
{
List *ptemp=pNode->next;
pNode->next=ptemp->next;
delete ptemp; //用new开辟的结点存储空间,用delete删除
}
count++;
pNode=pNode->next;
}
return head;
}
int main()
{
int n=20;
int x,m,p;
cout<<"开始顺序输出链表:\n";
List *head=createlist(n);
output(head,n); //正向输出
cout<<"开始倒序输出链表:\n";
inverse(head); //倒序输出
cout<<"在第几个结点后插入新结点: ";
cin>>x;
cout<<"插入数据为: ";
cin>>m;
insert(head, x, m);
cout<<"将第几个结点删除 ";
cin>>p;
head=Delete(head, p); //更新头结点(针对头结点被删除的情况)
cout<<"输出修改后的链表:\n";
output(head,n);
return 0;
}