zoukankan      html  css  js  c++  java
  • 双向链表内结点的删除(4)

    情况有三:

    • 情况1:删除链表的第一个结点

                (1) 将指向链表开始的指针head指向第二个结点.

                (2) 此时原链表的第二个结点将成为新链表的开始,并且将新链表开始结点的指针back设为NULL.

    • 情况2:删除最后一个结点

                 将原链表的最后一个结点之前一个结点的指针from设为NULL.

    • 情况3:删除链表内中间结点

                (1) 将链表内指针ptr所指结点的前一个结点指针front指向指针ptr所指结点的下一个结点.

                (2) 将链表内指针ptr所指结点的最后一个指针back指向指针ptr所指结点的前一个结点.

    双向链表内结点删除
    #include"iostream"
    #include
    "stdlib.h"
    using namespace std;


    struct dlist //双向链表结构声明
    {
    int data; //结点数据
    struct dlist *front; //指向下一结点的指针
    struct dlist *back; //指向前一结点的指针
    };
    typedef
    struct dlist dnode; //双向链表新类型
    typedef dnode *dlink; //双向链表指针新类型


    /*-----使用数组值创建双向链表----*/

    dlink createdlist(
    int *array,int len)
    {

    dlink head;
    //双向链表的指针
    dlink before; //前一节点的指针
    dlink new_node; //新结点的指针
    int i;

    /*------创建第一个结点--------*/

    /*--------分配结点内存--------*/
    head
    =(dlink)malloc(sizeof(dnode));
    if(!head) //检查内存指针
    return NULL;
    head
    ->data=array[0]; //创建结点内容
    head->front=NULL; //设置指针初值
    head->back=NULL; //设置指针初值
    before=head; //指向第一个结点


    for(i=1;i<len;i++) //用循环创建其他结点
    {

    /*--分配结点内存--*/
    new_node
    =(dlink)malloc(sizeof(dnode));
    if(!new_node)
    return NULL;
    new_node
    ->data=array[i]; //创建结点内容
    new_node->front=NULL;
    new_node
    ->back=before; //将新结点指向前结点
    before->front=new_node; //新结点成为前结点
    before=new_node;

    }
    return head;
    }

    /*--------释放双向链表的内存-----------*/

    void freedlist( dlink head)
    {
    dlink ptr;
    //存储目前结点指针
    while(head!=NULL) //链表遍历循环
    {
    ptr
    =head; //保留目前结点指针
    head=head->front; //指向下一个结点
    free(ptr); //释放目前结点内存
    }

    }

    /*-------双向链表的输出--------*/

    void printdlist( dlink head,dlink now)
    {
    while(head!=NULL) //链表遍历循环
    {
    if(head==now) //输出目前结点数据
    printf("#%d#",head->data); //输出结点数据
    else
    printf(
    "[%d]",head->data); //输出结点数据
    head=head->front; //指向下一个结点
    }
    printf(
    "\n");
    }

    /*-------双向链表的结点删除--------*/

    dlink deletenode(dlink head,dlink ptr)
    {
    if(ptr->back==NULL) //是否有前结点
    {
    /*----情况1:删除第一个结点----*/
    head
    =head->front; //指向下一个结点
    head->back=NULL; //设置指向前结点的指针
    }
    else
    {
    if(ptr->front==NULL) //是否指向下一个结点
    {
    /*---情况2:删除最后一个结点---*/

    ptr
    ->back->front=NULL; //前结点指向NULL

    }
    else
    {
    /*----情况3:删除中间结点----*/
    ptr
    ->back->front=ptr->front; //前结点指向下一结点
    ptr->front->back=ptr->back; //下一结点指向前结点
    }
    }
    free(ptr);
    //释放删除结点内存
    return head; //返回链表起始指针
    }

    /*-------------使用选项来移动结点后,删除目前的结点且将列出链表内容--------------*/
    int main()
    {
    dlink head ;
    //双向链表指针
    dlink now=NULL; //目前结点指针
    int list[6]={1,2,3,4,5,6};
    int select; //选择项1~4
    head=createdlist(list,6);
    if(head==NULL)
    {
    printf(
    "内存分配失败!n");
    exit(
    1);
    }

    while(1)
    {
    if(now==NULL)

    now
    =head; //目前指向第一结点
    printf("链表内容是:");
    printdlist(head,now);
    /*---选项内容---*/
    printf(
    "[1]往下移动 [2]往回移动 [3]删除结点 [4]离开 ==> ");
    scanf(
    "%d",&select);
    switch(select)
    {
    /*---往下移动--*/
    case 1: if(now->front!=NULL)
    now
    =now->front; //指向下一结点
    else
    printf(
    "在链表结尾\n");
    break;

    /*----往回移动----*/
    case 2: if(now->back!=NULL)
    now
    =now->back; //指向前一结点
    else
    printf(
    "在链表开始\n");
    break;


    /*----删除目前结点----*/
    case 3: if(head!=NULL)
    {
    head
    =deletenode(head,now);
    now
    =head; //目前指向第一结点

    }
    else
    printf(
    "链表是空的\n");
    break;
    /*----------离开---------*/
    case 4: freedlist(head);
    exit(
    1);
    }
    }
    }

          

  • 相关阅读:
    C# 操作配置文件
    C# Excel操作类
    没有找到 mspdb100.dll 的解决办法
    工厂方法模式
    .Net互操作2
    The certificate used to sign “AppName” has either expired or has been revoked. An updated certificate is required to sign and install the application解决
    手机抓包xcode自带命令行工具配合wireshark实现
    expecting SSH2_MSG_KEX_ECDH_REPLY ssh_dispatch_run_fatal问题解决
    使用ssh-keygen设置ssh无密码登录
    远程复制文件到服务器
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1881961.html
Copyright © 2011-2022 走看看