15-双向链表用法_案例代码

双向链表

代码 1 :

#include <stdio.h>
#include <stdlib.h>

typedef int data_t;

typedef struct node{
    data_t data;
    struct node * front;
    struct node * next;
}duolist_t;

//创建
duolist_t* create_duolist()
{
    duolist_t* list=malloc(sizeof(duolist_t));

    list->front=NULL; //头结点指向前方的指针

    list->next=malloc(sizeof(duolist_t));//头结点指向后面的指针

    list->next->front=list;//尾节点指向前面的指针

    list->next->next=NULL;//尾节点指向后面的指针

    return list;
}

//判空
int isempty(duolist_t* list)
{
    if(list==NULL)
        return 0;

    return list->next->next==NULL;

}

//增
int insert_duolist(duolist_t* list,data_t data)
{
    if(list==NULL)
        return -1;


    duolist_t* newnode=malloc(sizeof(duolist_t));

    newnode->data=data;


    newnode->front=list;

    newnode->next=list->next;

    newnode->front->next=newnode;

    newnode->next->front=newnode;

    return 0;
}

//删
int delete_duolist(duolist_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    duolist_t* temp=list->next;

    temp->front->next=temp->next;

    temp->next->front=temp->front;

    free(temp);

    return 0;
}

//查   返回谁的地址?
duolist_t* locate_duolist(duolist_t* list,data_t data)
{
    if(list==NULL||isempty(list))
        return NULL;

    while(list->next->next!=NULL)
    {
        if(list->next->data==data)
            return list->next;

        list=list->next;
    }

    return NULL;
}

//改
int change_duolist(duolist_t* list,data_t data)
{
    if(list==NULL)
        return -1;

    list->data=data;

    return 0;
}

//打印
int print_duolist(duolist_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    while(list->next->next!=NULL)
    {
        printf("%3d ",list->next->data);

        list=list->next;
    }
    printf("\n");

    return 0;
}

//逆打印
int reprint_duolist(duolist_t* list)
{
    if(list==NULL||isempty(list))
        return -1;


    while(list->next->next!=NULL)
    {
        list=list->next;

    }
    list=list->next;

    while(list->front->front!=NULL)
    {
        printf("%3d ",list->front->data);

        list=list->front;
    }
    printf("\n");

    return 0;
}

//长度
int length_duolist(duolist_t* list)
{
    if(list==NULL||isempty(list))
        return 0;

    int sum=0;
    while(list->next->next!=NULL)
    {
        sum++;

        list=list->next;
    }

    return sum;

}

//清空
int clear_duolist(duolist_t* list)
{
    if(list==NULL||isempty(list))
        return -1;

    while(list->next->next!=NULL)//length_duolist(list)
    {
        delete_duolist(list);

    }

    return 0;
}

//销毁
int destroy_duolist(duolist_t* list)
{
    if(list==NULL)
        return -1;

    if(!isempty(list))
        clear_duolist(list);

    free(list->next);

    free(list);

    return 0;
}

int main(int argc, const char *argv[])
{
    duolist_t* list=create_duolist();

    int i;

    for(i=1;i<=15;i++)
    {
        insert_duolist(list,i*2);

        print_duolist(list);
    }

    change_duolist(locate_duolist(list,20),250);
    print_duolist(list);

    insert_duolist(locate_duolist(list,250)->front,20);

    print_duolist(list);

    delete_duolist(locate_duolist(list,250)->front);

    print_duolist(list);

    reprint_duolist(list);

    printf("length_duolist:%d\n",length_duolist(list));

    clear_duolist(list);

    printf("length_duolist:%d\n",length_duolist(list));

    destroy_duolist(list);

    list=NULL;

    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢? 可以...
    rainchxy阅读 2,040评论 0 6
  • 本文内容:1、 什么是链表?2、 链表共分几类?3、 链表的 C 实现! 总表:《数据结构?》 工程代码 Gith...
    半纸渊阅读 40,068评论 0 54
  • 前言 在之前的文章中, 大家还记得我的链表和结点、结点协议的名字么? 1.CHRSinglyLinkedListN...
    Chrisss阅读 1,597评论 3 3
  • 练习32:双向链表 原文:Exercise 32: Double Linked Lists 译者:飞龙 这本书的目...
    布客飞龙阅读 547评论 0 37
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 4,302评论 4 12