链表的建立、删除、插入

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]


猜你喜欢

转载自blog.csdn.net/qingyingliu/article/details/79102107