1.链表的创建:
需要一个头指针、结点指针、尾指针即可。这里值得注意的是,创建的过程头指针是不能变的,而每次插入一个节点,尾指针都要后移一个节点(一开始把尾指针指向头指针),如创建含有n个结点的链表如下代码
node *Create()
{
int num,n;
cin>>n;//创建n个结点的链表
node *head=NULL,*ps,*pEnd;//头指针、结点指针、尾指针
ps=new node;//新建一个结点,准备插入链表
for(int i=1;i<=n;i++)
{
cin>>num;
ps->data=num;
if(head==NULL)
{
head=ps;
pEnd=head;
}
else
{
pEnd->next=ps;//插入结点
pEnd=ps;//尾指针后移
}
pEnd->next=NULL;
ps=new node;
}
delete ps;
mydelete(&(head));//删除一个结点
myinsert(head);//插入一个结点
return head;
}
2.链表的删除:链表的删除首先要先找到你要删除的结点。删除分为下面两种情况:
1删除链首的步骤:
a. P指向链首结点;
b. head指向链首的下一个结点
c. 删除p指向的结点
a删除非链首的结点的步骤:
a. p指向待删的结点
b. pGuard所指向的结点的next成员指向待删成员的下一个成员
c. 删除p所指向的结点
注:pGuard是指向待删结点的前一个结点。否则,待删结点的前一个结点地址丢失,其next成员无法与待删结点的后一结点链接。我们常称pGuard为“哨兵”。
void mydelete(node** head)//此函数为删除结点的值为number的结点
{
int number;
cin>>number;
node *pGuard,*num;//哨兵和待删的数字
pGuard=*head;
if((*head)->data==number)//如果待删的在头结点
{
num=*head;
(*head)=(*head)->next;
delete num;
return;
}
while(pGuard->next&&pGuard->next->data!=number)//查找待删结点的前一个结点
pGuard=pGuard->next;
num=pGuard->next;
pGuard->next=num->next;
delete num;
return ;
}
3.链表的插入:
链表的插入也是根据head是否改变把它分成两种情况,插入链首和非链首,
a. 链首情况
1head==NULL;
2head!=NULL‘
b. 非链首情况:
1.将插入结点指向当前结点的下一个结点
2.将当前结点指向插入结点
注意此处的顺序是重要的,如果先将当前结点的next成员修改,则失去与后继结点的联系,插入结点无法找到当前节点的下一结点。
void myinsert(node*head)
{
int item,loc;//插入的数字和位置
cin>>item>>loc;
node *num;
num=new node;
num->data=item;
if(head==NULL)
{
head=num;
num->next=NULL;
return;
}
if(loc==1)//如果插入在第一个位置
{
num->next=head;
head=num;
return;
}
node * pGuard=head;
for(int i=1;i<=loc-2;i++)
pGuard=pGuard->next;//找出哨兵
num->next=pGuard->next;//将插入结点指向当前结点的下一个结点
pGuard->next=num;//将当前结点指向插入结点
return;
}
最后放一个可以运行的代码吧
输入:第一行输入创建链表的结点个数
第二行输入每个结点的值
第三行输入要删除的值
第四行输入要插入的值和插入的位置
输入:一系列操作后所有结点的值
#include<iostream>
using namespace std;
struct node
{
int data;
node * next;
};
void mydelete(node** head);
void myinsert(node*head);
node *Create()
{
int num,n;
cin>>n;//创建n个结点的链表
node *head=NULL,*ps,*pEnd;//头指针、结点指针、尾指针
ps=new node;//新建一个结点,准备插入链表
for(int i=1;i<=n;i++)
{
cin>>num;
ps->data=num;
if(head==NULL)
{
head=ps;
pEnd=head;
}
else
{
pEnd->next=ps;//插入结点
pEnd=ps;//尾指针后移
}
pEnd->next=NULL;
ps=new node;
}
delete ps;
mydelete(&(head));//删除一个结点
myinsert(head);//插入一个结点
return head;
}
void mydelete(node** head)//此函数为删除结点的值为5的结点
{
int number;
cin>>number;
node *pGuard,*num;//哨兵和待删的数字
pGuard=*head;
if((*head)->data==number)//如果待删的在头结点
{
num=*head;
(*head)=(*head)->next;
delete num;
return;
}
while(pGuard->next&&pGuard->next->data!=number)//查找待删结点的前一个结点
pGuard=pGuard->next;
num=pGuard->next;
pGuard->next=num->next;
delete num;
return ;
}
void myinsert(node*head)
{
int item,loc;//插入的数字和位置
cin>>item>>loc;
node *num;
num=new node;
num->data=item;
if(head==NULL)
{
head=num;
num->next=NULL;
return;
}
if(loc==1)//如果插入在第一个位置
{
num->next=head;
head=num;
return;
}
node * pGuard=head;
for(int i=1;i<=loc-2;i++)
pGuard=pGuard->next;//找出哨兵
num->next=pGuard->next;//将插入结点指向当前结点的下一个结点
pGuard->next=num;//将当前结点指向插入结点
return;
}
void ShowList(node* head)
{
while(head!=NULL)
{
cout<<head->data<<" ";
head=head->next;
}
cout<<endl;
}
int main()
{
ShowList(Create());
}
最后,作者水平有限,如读者有发现什么错误,请联系作者或者在评论中说。欢迎交流。
作者邮箱:2596736318@qq.com