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());
}
最后,作者水平有限,如读者有发现什么错误,请联系作者或者在评论中说。欢迎交流。
作者邮箱:[email protected]