ds_day05

作业1

题目

双向链表

结果
在这里插入图片描述

代码

main.c

#include "head.h"

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

    // 头插
    printf("头插\n");
    datatype es[5] = {"hello","world","ok","123","haha"};
    for (int i = 0; i < 5; i++){
        list_head_insert(l, es[i]);
    }
    list_to_string(l);

    // 尾插
    printf("尾插\n");
    datatype es2[5] = {"qwe","asd","gg","456","ohh"};
    for (int i = 0; i < 5; i++){
        list_rear_insert(l, es2[i]);
    }
    list_to_string(l);

    // 头删
    list_head_del(l);
    printf("头删\n");
    list_to_string(l);

    // 尾删
    list_rear_del(l);
    printf("尾删\n");
    list_to_string(l);

    // 按位置插入
    datatype e;

    printf("位置3,插入three:\n");
    strcpy(e,"three");
    list_pos_insert(l, 3, e);
    list_to_string(l);

    // 按位置修改
    printf("位置1,修改为111:\n");
    strcpy(e,"111");
    list_pos_modify(l, 1, e);
    list_to_string(l);

    // 按位置删除
    printf("位置4,删除:\n");
    list_pos_del(l, 4);
    list_to_string(l);

    // 按位置查找
    printf("位置2,查找:\n");
    list_pos_search(l, 2);
    return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char datatype[20];

typedef struct Node {
    union {
        int len;
        datatype data;
    };
    struct Node *next;
    struct Node *prev;
} *dbl_l_st;

dbl_l_st create_head();
dbl_l_st create_Node();
int list_head_insert(dbl_l_st l, datatype e);
void list_to_string(dbl_l_st l);
int list_rear_insert(dbl_l_st l, datatype e);
int list_head_del(dbl_l_st l);
int list_rear_del(dbl_l_st l);
int list_pos_insert(dbl_l_st l, int pos, datatype e);
int list_pos_modify(dbl_l_st l, int pos, datatype e);
int list_pos_del(dbl_l_st l, int pos);
int list_pos_search(dbl_l_st l, int pos);

#endif

func.c

#include "head.h"

// 创建头结点
dbl_l_st create_head()
{
    dbl_l_st l = (dbl_l_st)malloc(sizeof(struct Node));
    if (l == NULL)
        return NULL;

    l->len = 0;
    l->next = NULL;
    l->prev = NULL;
    return l;
}

// 创建普通结点
dbl_l_st create_Node()
{
    dbl_l_st p = (dbl_l_st)malloc(sizeof(struct Node));
    if (p == NULL)
        return NULL;
    strcpy(p->data, "");
    p->next = NULL;
    p->prev = NULL;
    return p;
}

// 头插
int list_head_insert(dbl_l_st l, datatype e)
{
    if (l == NULL) {
        return -1;
    }
    dbl_l_st s = create_Node();
    if (s == NULL)
        return -1;
    strcpy(s->data, e);
    s->next = l->next;
    s->prev = l;
    if (l->next != NULL)
        l->next->prev = s;
    l->next = s;
    l->len++;
    return 0;
}

// 输出
void list_to_string(dbl_l_st l)
{
    if (l == NULL || l->len == 0) {
        printf("输出失败\n");
        return;
    }
    dbl_l_st p = l;
    while (p->next != NULL) {
        p = p->next;
        printf("%s  ", p->data);
    }
    printf("\n");
}

// 尾插
int list_rear_insert(dbl_l_st l, datatype e)
{
    if (l == NULL) {
        printf("插入失败\n");
        return -1;
    }
    dbl_l_st p = l;
    while (p->next != NULL) {
        p = p->next;
    }
    dbl_l_st s = create_Node();
    if (s == NULL)
        return -1;
    strcpy(s->data, e);
    p->next = s;
    s->prev = p;
    l->len++;
    return 0;
}

// 头删
int list_head_del(dbl_l_st l)
{
    if (l == NULL || l->len == 0) {
        printf("删除失败\n");
        return -1;
    }
    dbl_l_st q = l->next;
    l->next = q->next;
    if (q->next != NULL) {
        q->next->prev = l;
    }
    l->len--;
    return 0;
}

// 尾删
int list_rear_del(dbl_l_st l)
{
    if (l == NULL || l->len == 0) {
        printf("删除失败\n");
        return -1;
    }
    dbl_l_st p = l;
    for (int i = 0; i < l->len; i++) {
        p = p->next;
    }
    p->prev->next = p->next;
    free(p);
    p = NULL;
    l->len--;
    return 0;
}

// 按位置插入
int list_pos_insert(dbl_l_st l, int pos, datatype e)
{
    if (l == NULL || pos < 1 || pos > l->len + 1) {
        printf("插入失败\n");
        return -1;
    }
    dbl_l_st p = l;
    for (int i = 0; i < pos - 1; i++) {
        p = p->next;
    }
    dbl_l_st s = create_Node();
    if (s == NULL)
        return -1;
    strcpy(s->data, e);
    s->next = p->next;
    s->prev = p;
    if (p->next != NULL)
        p->next->prev = s;
    p->next = s;
    l->len++;
    return 0;
}

// 按位置修改
int list_pos_modify(dbl_l_st l, int pos, datatype e)
{
    if (l == NULL || pos < 1 || pos > l->len) {
        printf("修改失败\n");
        return -1;
    }
    dbl_l_st p = l;
    for (int i = 0; i < pos; i++) {
        p = p->next;
    }
    strcpy(p->data, e);
    return 0;
}

// 按位置删除
int list_pos_del(dbl_l_st l, int pos)
{
    if (l == NULL || pos < 1 || pos > l->len) {
        printf("删除失败\n");
        return -1;
    }
    dbl_l_st p = l;
    for (int i = 0; i < pos; i++) {
        p = p->next;
    }
    p->prev->next = p->next;
    if (p->next != NULL)
        p->next->prev = p->prev;
    free(p);
    p = NULL;
    l->len--;
    return 0;
}

// 按位置查找
int list_pos_search(dbl_l_st l, int pos)
{
    if (l == NULL || pos < 1 || pos > l->len) {
        printf("查找失败\n");
        return -1;
    }
    dbl_l_st p = l;
    for (int i = 0; i < pos; i++) {
        p = p->next;
    }
    printf("该位置的值是:%s\n", p->data);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值