数据结构DAY5-双向链表

作业
双向链表按位置删除
双向链表按位置修改
双向链表按位置查找

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
    Doublelink L = create_head();

    // 头插
    int n;
    datetype e;
    printf("请输入要头插入元素的个数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        printf("请输入要插入的值:");
        scanf(" %c", &e);
        insert_head(L, e);
    }

    // 输出
    Out(L);

    // 尾插
    printf("\n请输入要尾插入元素的个数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        printf("请输入要插入的值:");
        scanf(" %c", &e);
        insert_rear(L, e);
    }
    printf("\n尾插后的值\n");
    Out(L);

    // 头删:永远删除头节点
    delete_head(L);
    delete_head(L);
    printf("\n头删后的值\n");
    Out(L);

    // 尾删:永远删除尾节点
    delete_rear(L);
    delete_rear(L);
    printf("\n尾删后的值\n");
    Out(L);

    //按位置插入
    int pos;
    printf("\n请输入要插入的位置:");
    scanf("%d",&pos);
    printf("请输入要插入值:");
    scanf(" %c",&e);
    insert_by_pos(L,pos,e);
    printf("\n按位置插入后的值\n");
    Out(L);

//按位置删除
    printf("\n请输入要删除的位置:");
    scanf("%d",&pos);
    deletet_by_pos(L,pos);
    printf("\n按位置删除后的值\n");
    Out(L);
    printf("\n");

    //按位置修改
    printf("请输入要修改的位置:");
    scanf("%d",&pos);
    printf("请输入要修改的值:");
    scanf(" %c",&e);
    revamp_by_pos(L,pos,e);
    printf("\n按位置修改后的值\n");
    Out(L);

    //按位置查找
    printf("请输入想要查找值的下标:");
    scanf("%d",&pos);
    find_by_pos(L,pos);
   



    return 0;
}

test.c

#include "head.h"

Doublelink create_head()
{
    Doublelink L = (Doublelink)malloc(sizeof(struct Node));
    if (L == NULL)
    {
        return NULL;
    }
    // L节点的数据域
    L->len = 0;
    // L后继指针域
    L->next = NULL;
    // L前驱指针域
    L->prev = NULL;

    return L;
}

// 创建普通节点
Doublelink create_node()
{
    Doublelink p = (Doublelink)malloc(sizeof(struct Node));
    if (p == NULL)
    {
        return NULL;
    }
    // L节点的数据域
    p->date = 0;
    // L后继指针域
    p->next = NULL;
    // L前驱指针域
    p->prev = NULL;

    return p;
}

// 头插
int insert_head(Doublelink L, datetype e)
{
    // 判断头节点是否存储
    if (L == NULL)
    {
        return -1;
    }

    // 创建新节点
    Doublelink p = create_node();
    if (p == NULL)
        return -1;
    // p的数据域
    p->date = e;
    // p的指针域
    p->next = L->next;
    p->prev = L;
    if (L->next != NULL)
    {
        L->next->prev = p;
    }

    L->next = p;
    L->len++;
}

// 输出
void Out(Doublelink L)
{

    Doublelink p = L;

    if(0==L->len)
    {
        printf("长度为0\n");
        return 0;
    }
    printf("正向结果是:\n");
    while (p->next)
    {
        p = p->next;
        printf("%c\t", p->date);
    }

    printf("\n逆向结果是:\n");

 

    while (p->prev->prev)
    {
        printf("%c\t", p->date);
        p = p->prev;
    }
}

// 尾插
int insert_rear(Doublelink L, datetype e)
{
    // 判断头节点是否存在
    if (L == NULL)
    {
        printf("插入失败\n");
        return -1;
    }

    // 找到尾部
    Doublelink p = L;

    while (p->next)
    {
        p = p->next;
    }

    // 在p后面插入新节点
    Doublelink s = create_node();

    if (s == NULL)
    {
        return -1;
    }

    // s的数据域
    s->date = e;

    // s的指针域
    s->next = p->next;
    s->prev = p;
    p->next = s;

    L->len++;

    return 0;
}

// 头删
int delete_head(Doublelink L)
{
    // 判断头节点是否存在
    // 判断链表是否为空
    if (L == NULL || L->len == 0)
    {
        printf("删除失败\n");
        return -1;
    }

    Doublelink p = L->next;
    L->next = p->next;
    if (p->next != NULL)
    {
        p->next->prev = L;
    }

    free(p);
    p = NULL;

    L->len--;

    return 0;
}

// 尾删
int delete_rear(Doublelink L)
{
    // 判断头节点是否存在
    // 判断链表是否为空
    if (L == NULL || L->len == 0)
    {
        printf("删除失败\n");
        return -1;
    }

    Doublelink p = L;
    // 循环到最后一位
    while (p->next)
    {
        p = p->next;
    }

    // 删除p节点
    p->prev->next = NULL;
    free(p);
    p = NULL;

    L->len--;

    return 0;
}

// 按位置插入
int insert_by_pos(Doublelink L, int pos, datetype e)
{
    if (L == NULL || pos < 1 || pos > L->len + 1)
    {
        return -1;
    }

    Doublelink p = L;

    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }

    Doublelink s = create_node();

    if (s == NULL)
    {
        return -1;
    }

    s->date = e;

    s->next = p->next;
    s->prev = p;
    if (p->next != NULL)
    {
        p->next->prev = s;
    }
    p->next = s;
    L->len++;

    return 0;
}

int deletet_by_pos(Doublelink L, int pos)
{
    if (L == NULL || L->len == 0 || pos < 1 || pos > L->len)
    {
        printf("插入失败\n");
        return -1;
    }

    Doublelink p = L;

    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }

    Doublelink q = p->next;

    p->next = q->next;
    q->prev = p;

    free(q);
    q = NULL;
    L->len--;

    return 0;
}

int revamp_by_pos(Doublelink L, int pos, datetype e)
{
    if (L == NULL || pos < 1 || pos > L->len + 1)
    {
        printf("修改失败\n");
        return -1;
    }

    Doublelink p = L;

    for (int i = 0; i < pos - 1; i++)
    {
        p = p->next;
    }

    p->next->date = e;

    return 0;
}

int find_by_pos(Doublelink L,int pos)
{
    if(L==NULL || pos<1 || pos>L->len)
    {
        printf("查找失败\n");
        return -1;
    }

    Doublelink p=L;

    for(int i=0;i<pos;i++)
    {
        p=p->next;
    }



    printf("%d下标对应的值是%c\n",pos,p->date);

    return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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

typedef char datetype;

typedef struct Node
{
    // 数据域
    union
    {
        int len;       // 头节点的数据域
        datetype date; // 其他节点的数据元素
    };

    // 后继指针域
    struct Node *next;

    // 前驱指针域
    struct Node *prev;

} *Doublelink;

Doublelink create_head();
Doublelink create_node();
int insert_head(Doublelink L, datetype e);
void Out(Doublelink L);
int insert_rear(Doublelink L, datetype e);
int delete_head(Doublelink L);
int delete_rear(Doublelink L);
int insert_by_pos(Doublelink L,int pos,datetype e);
int revamp_by_pos(Doublelink L, int pos, datetype e);
int find_by_pos(Doublelink L,int pos);

#include "test.c"
#endif

作业
单向循环链表尾插
单向循环链表头删
单向循环链表尾删
单向循环链表遍历

main.c

#include "head.h"

int main(int argc,const char * argv[])
{
    //创建头节点
    LoopLink L=create_head();

    //头插
    int n;
    datetype e;

    printf("请输入要插入的个数:");
    scanf("%d",&n);
    
    for(int i=0;i<n;i++)
    {
        printf("请输入要插入的值:");
        scanf("%f",&e);
        insert_head(L,e); 
    }
    printf("头插后的结果:\n");
    Out(L);
    

    //尾插
    printf("\n请输入要插入数的个数:\n");
    scanf("%d",&n);
    
    for(int i=0;i<n;i++)
    {
        printf("请输入要插入的值:");
        scanf("%f",&e);
        insert_rear(L,e);
    }
    printf("尾插后的结果:\n");
    Out(L);

    //头删
    delete_head(L);
    delete_head(L);
    printf("\n头删后的结果:\n");
    Out(L);

    //尾删
    delete_rear(L);
    delete_rear(L);
    printf("\n尾删后的结果:\n");
    Out(L);
    
    return 0;
}

test.c

#include "head.h"

//创建头节点
LoopLink create_head()
{
    LoopLink L=(LoopLink)malloc(sizeof(struct Node));
    if(L==NULL)
    {
        return NULL;
    }

    L->len=0;
    L->next=L;

    return L;
}

//创建普通节点
LoopLink create_node()
{
    LoopLink p=(LoopLink)malloc(sizeof(struct Node));
    if(p==NULL)
    {
        return NULL;
    }

    p->date=0;
    p->next=NULL;

     return p;

}

 //头插
int insert_head(LoopLink L,datetype e)
{
    //1.判断头节点是否存在
    if(L==NULL)
    {
        printf("插入失败\n");
        return -1;
    }

    //2.创建新的节点
    LoopLink p=create_node();
    if(p==NULL)
    {
        return -1;
    }

    //3.p的数据域
    p->date=e;

    //4.p的指针域
    p->next=L->next;

    L->next=p;
    L->len++;

      return 0;

}

//输出
void Out(LoopLink L)
{
    LoopLink p=L;

    while(p->next!=L)
    {
        p=p->next;
        printf("%.2f\t",p->date);
    }
}

//尾插
int insert_rear(LoopLink L,datetype e)
{
    //1.判断头节点是否存在
    if(L==NULL)
    {
        printf("插入失败\n");
        return -1;
    }

    LoopLink p=L;
    while(p->next!=L)
    {
        p=p->next;
    }
    //2.创建新的节点
    LoopLink s=create_node();
    if(s==NULL)
    {
        return -1;
    }

    //3.p的数据域
    s->date=e;

    //4.p的指针域
    p->next=s;
    s->next=L;
    L->len++;
}
/*
//头删
int delete_head(LoopLink L)
{
    if(L==NULL || L->len==0)
    {
        printf("删除失败\n");
        return -1;
    }

    LoopLink p=L->next;

    L->next=p->next;
    free(p);
    p==NULL;
    L->len--;

    return 0;
}
*/
int delete_rear(LoopLink L)
{
    if(L==NULL || L->len==0)
    {
        printf("删除失败\n");
        return -1;
    }

    LoopLink p=L->next;

    while(p->next->next!=L)
    {
        p=p->next;
        printf("1");
    }

    LoopLink q=p;

    q=p->next;
    p->next=L;
    free(q);
    q==NULL;
    L->len--;

    return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

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


typedef float datetype;

typedef struct Node
{
    // 数据域
    union
    {
        int len;       
        datetype date; 
    };

    // 指针域
    struct Node *next;
} *LoopLink;

LoopLink create_head();
void Out(LoopLink L);
LoopLink create_node();
int insert_rear(LoopLink L,datetype e);
int delete_head(LoopLink L);
int delete_rear(LoopLink L);




#include "test.c"
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值