2024.02.04作业

本文详细介绍了如何用C语言实现双向链表的头插、头删、尾插、尾删以及在任意位置插入、删除、修改和查找功能。同时,对比了栈和队列的基本概念,以及解释了内存泄漏的概念和影响。

1.请编程实现双向链表的头插,头删,尾插,尾删

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

typedef int datatype;
typedef struct Node
{
    datatype data;
    struct Node* next;
    struct Node* front;
} *DoubleLink;

DoubleLink create_node()
{
    DoubleLink node = (DoubleLink)malloc(sizeof(struct Node));

    if (NULL == node)
    {
        return NULL;
    }

    node->next = NULL;
    node->front = NULL;
    return node;
}

DoubleLink head_insert(DoubleLink head, datatype element)
{
    DoubleLink p = create_node();
    if (NULL == p)
    {
        puts("头插:头插失败");
        return head;
    }

    printf("头插:%d\n", element);
    p->data = element;
    if (NULL == head)
    {
        head = p;
    }
    else
    {
        p->next = head;
        head->front = p;
        head = p;
    }

    return head;
}

DoubleLink head_delete(DoubleLink head)
{
    if (NULL == head)
    {
        puts("头删:空链表");
        return NULL;
    }

    
    if (NULL == head->next)
    {
        printf("头删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }

    DoubleLink p = head;
    head = head->next;
    head->front = NULL;
    printf("头删:%d\n", p->data);
    free(p);
    p = NULL;

    return head;
}

DoubleLink tail_insert(DoubleLink head, datatype element)
{
    DoubleLink p = create_node();
    if (NULL == p)
    {
        puts("尾插:尾插失败");
        return head;
    }

    printf("尾插:%d\n", element);
    p->data = element;

    if (NULL == head)
    {
        head = p;
        return head;
    }

    DoubleLink q = head;
    while (q->next != NULL)
    {
        q = q->next;
    }
    q->next = p;
    p->front = q;

    return head;
}

DoubleLink tail_delete(DoubleLink head)
{
    if (NULL == head)
    {
        puts("尾删:空链表");
        return NULL;
    }

    if (NULL == head->next)
    {
        printf("尾删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }

    DoubleLink p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    DoubleLink q = p->front;
    q->next = NULL;
    printf("尾删:%d\n", p->data);
    free(p);
    p = NULL;

    return head;
}

void show(DoubleLink head)
{
    if (NULL == head)
    {
        puts("空链表");
        return;
    }

    DoubleLink p = head;
    printf("展示:");
    while (NULL != p)
    {
        printf("%2d", p->data);
        p = p->next;
    }
    puts("");
}

int main()
{
    int n = 5;
 
    DoubleLink head = NULL;
    for (int i = 0; i < n; i++)
    {
        head = head_insert(head, i);
    }
    show(head);
 
    for (int i = 0; i < n; i++)
    {
        head = tail_insert(head, i);
    }
    show(head);
 
    head = head_delete(head);
    head = tail_delete(head);
    show(head);

    return 0;
}

2.请编程实现双向链表按任意位置插入,删除,修改,查找

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

typedef int datatype;
typedef struct Node
{
    datatype data;
    struct Node* next;
    struct Node* front;
} *DoubleLink;

DoubleLink create_node()
{
    DoubleLink node = (DoubleLink)malloc(sizeof(struct Node));

    if (NULL == node)
    {
        return NULL;
    }

    node->next = NULL;
    node->front = NULL;
    return node;
}

DoubleLink head_insert(DoubleLink head, datatype element)
{
    DoubleLink p = create_node();
    if (NULL == p)
    {
        puts("头插:头插失败");
        return head;
    }

    printf("头插:%d\n", element);
    p->data = element;
    if (NULL == head)
    {
        head = p;
    }
    else
    {
        p->next = head;
        head->front = p;
        head = p;
    }

    return head;
}

DoubleLink head_delete(DoubleLink head)
{
    if (NULL == head)
    {
        puts("头删:空链表");
        return NULL;
    }

    
    if (NULL == head->next)
    {
        printf("头删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }

    DoubleLink p = head;
    head = head->next;
    head->front = NULL;
    printf("头删:%d\n", p->data);
    free(p);
    p = NULL;

    return head;
}

DoubleLink tail_insert(DoubleLink head, datatype element)
{
    DoubleLink p = create_node();
    if (NULL == p)
    {
        puts("尾插:尾插失败");
        return head;
    }

    printf("尾插:%d\n", element);
    p->data = element;

    if (NULL == head)
    {
        head = p;
        return head;
    }

    DoubleLink q = head;
    while (q->next != NULL)
    {
        q = q->next;
    }
    q->next = p;
    p->front = q;

    return head;
}

DoubleLink tail_delete(DoubleLink head)
{
    if (NULL == head)
    {
        puts("尾删:空链表");
        return NULL;
    }

    if (NULL == head->next)
    {
        printf("尾删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }

    DoubleLink p = head;
    while (p->next != NULL)
    {
        p = p->next;
    }
    DoubleLink q = p->front;
    q->next = NULL;
    printf("尾删:%d\n", p->data);
    free(p);
    p = NULL;

    return head;
}

void show(DoubleLink head)
{
    if (NULL == head)
    {
        puts("空链表");
        return;
    }

    DoubleLink p = head;
    printf("展示:");
    while (NULL != p)
    {
        printf("%2d", p->data);
        p = p->next;
    }
    puts("");
}

int get_length(DoubleLink head)
{
    if (NULL == head)
    {
        return 0;
    }

    int i = 0;
    while (head != NULL)
    {
        head = head->next;
        i++;
    }
    return i;
}

DoubleLink index_insert(DoubleLink head, int index, datatype element)
{
    DoubleLink p = create_node();
    if (NULL == p)
    {
        puts("按位置插入:初始化内存失败");
        return head;
    }

    int n = get_length(head);
    if (index < 1 || index > n)
    {
        puts("按位置插入:位置不合法");
        return head;
    }

    printf("按位置插入:在 %d 位插入元素 %d\n", index, element);
    p->data = element;
    if (1 == index)
    {
        p->next = head;
        head->front = p;
        head = p;
        return head;
    }
    
    DoubleLink q = head;
    for (int i = 1; i < index - 1; i++)
    {
        q = q->next;
    }
    p->next = q->next;
    p->next->front = p;
    q->next = p;
    p->front = q;

    return head;
}

DoubleLink index_delete(DoubleLink head, int index)
{
    if (NULL == head)
    {
        puts("按位置删除:空链表");
        return head;
    }

    int n = get_length(head);
    if (index < 1 || index > n)
    {
        puts("按位置删除:位置不合法");
        return head;
    }

    if (1 == index)
    {
        DoubleLink p = head;
        head = head->next;
        head->front = NULL;
        printf("按位置删除:在 %d 位删除元素 %d\n", index, p->data);
        free(p);
        p = NULL;
        return head;
    }
    
    DoubleLink p = head;
    for (int i = 1; i < index - 1; i++)
    {
        p = p->next;
    }
    DoubleLink q = p->next;
    p->next = q->next;
    q->next->front = p;
    printf("按位置删除:在 %d 位删除元素 %d\n", index, q->data);
    free(q);
    q = NULL;

    return head;
}

DoubleLink index_select(DoubleLink head, int index)
{
    if (NULL == head)
    {
        puts("按位置查找:空链表");
        return head;
    }

    int n = get_length(head);
    if (index < 1 || index > n)
    {
        puts("按位置查找:位置不合法");
        return head;
    }

    if (1 == index)
    {
        printf("按位置查找:在 %d 位的元素是 %d\n", index, head->data);
        return head;
    }
    
    DoubleLink p = head;
    for (int i = 1; i < index; i++)
    {
        p = p->next;
    }
    printf("按位置查找:在 %d 位的元素是 %d\n", index, p->data);

    return head;
}

DoubleLink index_change(DoubleLink head, int index, datatype element)
{
    if (NULL == head)
    {
        puts("按位置查找:空链表");
        return head;
    }

    int n = get_length(head);
    if (index < 1 || index > n)
    {
        puts("按位置查找:位置不合法");
        return head;
    }

    if (1 == index)
    {
        printf("按位置修改:在 %d 位元素 %d 修改为 %d\n", index, head->data, element);
        head->data = element;
        return head;
    }
    
    DoubleLink p = head;
    for (int i = 1; i < index; i++)
    {
        p = p->next;
    }
    printf("按位置修改:在 %d 位元素 %d 修改为 %d\n", index, p->data, element);
    p->data = element;

    return head;
}

int main()
{
    int n = 5;
 
    DoubleLink head = NULL;
    for (int i = 0; i < n; i++)
    {
        head = head_insert(head, i);
    }
    show(head);
 
    for (int i = 0; i < n; i++)
    {
        head = tail_insert(head, i);
    }
    show(head);
 

    head = index_insert(head, 6, 6);
    show(head);
    
    head = index_delete(head, 9);
    show(head);

    head = index_select(head, 8);

    head = index_change(head, 8, 8);
    show(head);

    return 0;
}

3.请简述栈和队列的区别

栈:只允许在表尾进行插入和删除,先进后出,后进先出

队列:只允许在表头删除,在表尾插入,先进先出,后进后出

4.请简述什么是内存泄漏

在程序中有已动态分配的堆内存由于某种原因未被释放或者无法释放,造成系统内存的浪费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值