• 双向链表内结点的删除(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);
    }
    }
    }

          

  • 相关阅读:
    jquery.tmpl.js 模板引擎用法
    var 的使用
    BUG集锦
    jquery Ajax异步请求之session
    找到多个与名为“Login”的控制器匹配的类型
    蒙板 模态对话框
    mvc通过ActionFilterAttribute做登录检查
    MVC 分页
    MVC 创建线程内的db单例
    Servlet生命周期中的service方法分析
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1881961.html
Copyright © 2020-2023  润新知