数据结构0709作业

一、思维导图

二、实现双向循环链表的 创建、判空、尾插、遍历、尾删、销毁

头文件

#ifndef __DOUBULARLINK_H__
#define __DOUBULARLINK_H__

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

typedef int dataType;
typedef struct Node
{
    union
    {
        int len;
        dataType data;
    };
    struct Node *Next;
    struct Node *Last;
}DCLk, *DCLkPtr;

//创建
DCLkPtr Link_create();
//判空
int Link_empty(DCLkPtr L);
//申请结点,封装数据
DCLkPtr Node_create(dataType n);
//尾插
int Tail_insert(DCLkPtr L, dataType n);
//遍历
void Link_show(DCLkPtr L);
//尾删
int Tail_delet(DCLkPtr L);
//销毁
void Link_destory(DCLkPtr L);

#endif

源文件

#include "doubularLink.h"

//1、创建链表(头结点)
DCLkPtr Link_create(){
    DCLkPtr L = (DCLkPtr)malloc(sizeof(DCLk));  //申请一个节点空间
    if(L == NULL){
        printf("Creation failed!\n");
        return NULL;
    }
    //申请成功 数据域置0 指针域指向头结点
    L->len = 0;
    L->Next = L;
    L->Last = L;
    printf("Creation succeed!\n");
    return L;
}
//2、判段是否为空
int Link_empty(DCLkPtr L){
    //判断链表是否合法
    if(L == NULL){
        printf("Judgment failed!\n");
        return -1;
    }
    return L->len == 0;
}
//3、申请结点,封装数据
DCLkPtr Node_create(dataType n){
    DCLkPtr N = (DCLkPtr)malloc(sizeof(DCLk));  //申请一个节点空间
    if(N == NULL){
        printf("Creation failed!\n");
        return NULL;
    }
    N->data = n;
    N->Next = NULL;
    N->Last = NULL;
    return N;
}
//4、链表尾部插入数据
int Tail_insert(DCLkPtr L, dataType n){
    //判断链表是否合法
    if(L == NULL){
        printf("Insertion failed!\n");
        return 0;
    }
    DCLkPtr N = Node_create(n);  //创建(预插入)结点接收数据
    DCLkPtr p = L; //创建一个结点 指向尾结点
    for(int i=0; i<L->len; i++)
        p = p->Next;
    //插入
    N->Next = L;
    N->Last = p;
    p->Next = N;
    L->Last = N;
    L->len++;  //插入成功 链表长度自增
    return 1;
}
//5、遍历结点 打印数据
void Link_show(DCLkPtr L){
    //判断结点是否合法、非空
    if(L == NULL || Link_empty(L)){
        printf("Insertion failed!\n");
        return;
    }
    DCLkPtr p = L;  //创建一个遍历的结点
    for(int i=0; i<L->len; i++){
        p = p->Next;
        printf("%d ", p->data);
    }
    putchar(10);
}
//6、链表尾部删除数据
int Tail_delet(DCLkPtr L){
    //判断是否链表合法、非空
    if(L == NULL || Link_empty(L)){
        printf("Deletion failed!\n");
        return 0;
    }
    DCLkPtr p = L; //创建一个结点 指向倒数第二结点
    for(int i=1; i<L->len; i++)
        p = p->Next;
    DCLkPtr q = p->Next; //创建一个结点 指向尾结点
    p->Next = q->Next;
    q->Next->Last = p;
    //释放空间 防止野指针
    free(q);
    q = NULL;
    L->len--;  //删除成功 链表长度自减
    return 1;
}
//7、销毁链表
void Link_destory(DCLkPtr L){
    //判断链表是否合法
    if(L == NULL){
        printf("Destruction failed!\n");
        return;
    }
    for(int i=0; i<L->len; i++)
        Tail_delet(L);
    free(L);
    L = NULL;
    printf("Destruction succeed!\n");
}

测试文件

#include "doubularLink.h"

int main()
{
    //创建链表
    DCLkPtr L = Link_create();
    //尾插
    Tail_insert(L, 11);
    Tail_insert(L, 22);
    Tail_insert(L, 33);
    Tail_insert(L, 44);
    Tail_insert(L, 55);
    //遍历
    Link_show(L);
    //尾删
    Tail_delet(L);
    Link_show(L);
    //销毁
    Link_destory(L);
    L = NULL;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值