2024.7.19 作业

/*******************************************/

文件名:linklist.c

功能:函数内容

/*******************************************/

#include "linklist.h"
NodePtr list_create()
{
    NodePtr L = (NodePtr)malloc(sizeof(Node));
    if (NULL == L)
    {
        printf("创建失败\n");
        return NULL;
    }
    L->len = 0;
    L->next = NULL;
    printf("链表创建成功\n");
    return L;
}
NodePtr apply_node(datatype e)
{
    NodePtr p = (NodePtr)malloc(sizeof(Node));
    if (NULL == p)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    p->data = e;
    p->next = NULL;
    return p;
}
int list_empty(NodePtr L)
{
    return L->next == NULL;
}
int list_insert_head(NodePtr L, datatype e)
{
    if (NULL == L)
    {
        printf("链表不合法\n");
        return -1;
    }
    NodePtr p = apply_node(e);
    if (NULL == p)
    {
        return -1;
    }
    p->next = L->next;
    L->next = p;
    L->len++;
    printf("头插成功\n");
    return 0;
}
int list_show(NodePtr L)
{
    if (NULL == L || list_empty(L))
    {
        printf("遍历失败\n");
        return -1;
    }
    printf("链表中的元素分别是:");
    NodePtr q = L->next;
    while (q != NULL)
    {
        printf("%d\t", q->data);
        q = q->next;
    }
    printf("\n");
}
NodePtr list_search_pos(NodePtr L, int pos)
{
    if (NULL == L || list_empty(L) || pos < 0 || pos > L->len)
    {
        printf("查找失败\n");
        return NULL;
    }
    NodePtr q = L;
    for (int i = 0; i < pos; i++)
    {
        q = q->next;
    }
    return q;
}
int list_insert_pos(NodePtr L, int pos, datatype e)
{
    if (NULL == L || list_empty(L) || pos < 1 || pos > L->len + 1)
    {
        printf("插入失败\n");
        return -1;
    }
    NodePtr q = apply_node(e);
    if (NULL == q)
    {
        return -1;
    }
    NodePtr p = list_search_pos(L, pos - 1);
    q->next = p->next;
    p->next = q;
    L->len++;
    printf("插入成功\n");
    return 0;
}
int list_delete_head(NodePtr L)
{
    if (NULL == L || list_empty(L))
    {
        printf("删除失败\n");
        return -1;
    }
    NodePtr p = L->next;
    L->next = p->next;
    free(p);
    p = NULL;
    L->len--;
    printf("头删成功\n");
    return 0;
}
int list_delete_pos(NodePtr L, int pos)
{
    if (NULL == L || list_empty(L) || pos < 1 || pos > L->len)
    {
        printf("删除失败\n");
        return -1;
    }
    NodePtr p = list_search_pos(L, pos - 1);
    NodePtr q = p->next;
    p->next = p->next->next;
    L->len--;
    free(q);
    q = NULL;
    printf("删除成功\n");
    return 0;
}
int list_search_value(NodePtr L, datatype e)
{
    if (NULL == L || list_empty(L))
    {
        printf("查找失败\n");
        return -1;
    }
    NodePtr q = L->next;
    for (int i = 1; i <= L->len; i++)
    {
        if (q->data == e)
        {
            return i;
        }
        q = q->next;
    }
    printf("未找到\n");
    return -1;
}
int list_update_pos(NodePtr L, int pos, datatype e)
{
    if (NULL == L || list_empty(L) || pos < 1 || pos > L->len)
    {
        printf("修改失败\n");
        return -1;
    }
    NodePtr p = list_search_pos(L, pos);
    p->data = e;
    printf("修改成功\n");
    return 0;
}
int list_update_value(NodePtr L, datatype old_e, datatype new_e)
{
    if (NULL == L || list_empty(L))
    {
        printf("修改失败\n");
        return -1;
    }
    int res = list_search_value(L, old_e);
    if (res == -1)
    {
        printf("没有要修改的值\n");
        return -1;
    }
    list_update_pos(L, res, new_e);
    printf("修改成功\n");
    return 0;
}
void list_reverse(NodePtr L)
{
    if (NULL == L || L->len <= 1)
    {
        printf("翻转失败\n");
        return;
    }
    NodePtr H = L->next;
    L->next = NULL;
    NodePtr p = NULL;
    while (H != NULL)
    {
        p = H;
        H = H->next;
        p->next = L->next;
        L->next = p;
    }
    printf("翻转成功\n");
}
void list_destroy(NodePtr L)
{
    if (NULL == L)
    {
        return;
    }
    while (!list_empty(L))
    {
        list_delete_head(L);
    }
    free(L);
    L = NULL;
    printf("释放成功\n");
}
void list_reverse_next(NodePtr L)
{
    static int i = 0;
    if (NULL == L || L->len <= 1)
    {
        printf("翻转失败\n");
        return;
    }
    if (i == L->len)
    {
        printf("翻转完成\n");
        return;
    }
    NodePtr p = list_search_pos(L, L->len);
    NodePtr q = list_search_pos(L, L->len - 1);
    NodePtr r = list_search_pos(L, i);
    q->next = NULL;
    p->next = r->next;
    r->next = p;
    i++;
    list_reverse_next(L);
}
void list_sort(NodePtr L)
{
    if (NULL == L || L->len <= 1)
    {
        printf("排序失败\n");
        return;
    }
    for (int i = 1; i < L->len; i++)
    {
        NodePtr p = L->next;
        NodePtr q = L->next->next;
        NodePtr r = L;
        for (int j = 0; j < L->len - i; j++)
        {
            if (p->data > q->data)
            {
                p->next = q->next;
                r->next = q;
                q->next = p;
                q = p->next;
                r = r->next;
            }
            else
            {
                p = p->next;
                q = p->next;
                r = r->next;
            }
        }
    }
    printf("排序完成\n");
}
void list_remove(NodePtr L)
{

    for (int i = 0; i < L->len-1; i++)
    {
        NodePtr p = list_search_pos(L, i);
        for (int j = i+1; j < L->len; j++)
        {
            NodePtr q = list_search_pos(L, j);
            if (p->data == q->data)
            {
                NodePtr r = list_search_pos(L, j - 1);
                r->next = q->next;
                L->len--;
                free(q);
                q=NULL;
                j--;
            }
        }
    }
    printf("去重成功\n");
}

/*******************************************/

文件名:linklist.h

功能:函数声明

/*******************************************/

#ifndef LINKLIST_H
#define LINKLIST_H
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
    union
    {
        int len;
        datatype data;
    };
    struct Node *next;
} Node, *NodePtr;
NodePtr list_create();
NodePtr apply_node(datatype e);
int list_empty(NodePtr L);
int list_insert_head(NodePtr L, datatype e);
int list_show(NodePtr L);
NodePtr list_search_pos(NodePtr L, int pos);
int list_insert_pos(NodePtr L, int pos, datatype e);
int list_delete_head(NodePtr L);
int list_delete_pos(NodePtr L, int pos);
int list_search_value(NodePtr L, datatype e);
int list_update_pos(NodePtr L, int pos, datatype e);
int list_update_value(NodePtr L, datatype old_e, datatype new_e);
void list_reverse(NodePtr L);
void list_destroy(NodePtr L);
void list_reverse_next(NodePtr L);
void list_sort(NodePtr L);
void list_remove(NodePtr L);
#endif

/*******************************************/

文件名:main1.c

功能:函数内容

/*******************************************/

#include "linklist.h"
int main(int argc, char const *argv[])
{
    NodePtr L = list_create();
    if (NULL == L)
    {
        return -1;
    }
    list_insert_head(L, 520);
    list_insert_head(L, 1314);
    list_insert_head(L, 555);
    list_insert_head(L, 666);
    list_show(L);
    list_insert_pos(L, 1, 888);
    list_insert_pos(L, 2, 888);
    list_insert_pos(L, 4, 777);
    list_insert_pos(L, 7, 999);
    list_show(L);
    list_delete_head(L);
    list_show(L);
    list_delete_pos(L, 3);
    list_show(L);
    int a = list_search_value(L, 888);
    if (a != -1)
    {
        printf("要找的在第%d个位置\n", a);
    }
    int b = list_search_value(L, 1);
    if (b != -1)
    {
        printf("要找的在第%d个位置\n", b);
    }
    list_update_pos(L, 1, 1130);
    list_show(L);
    list_update_value(L,666,888);
    list_update_value(L,345,777);
    list_show(L);
    list_reverse(L);
    list_show(L);
    list_reverse_next(L);
    list_show(L);
    list_sort(L);
    list_show(L);
    list_insert_pos(L, 1, 888);
    list_insert_pos(L, 3, 888);
    list_insert_pos(L, 1, 888);
    list_insert_pos(L, 7, 999);
    list_show(L);
    list_remove(L);
    list_show(L);
    list_destroy(L);
    L=NULL;
    list_show(L);
    return 0;
}

 结果:

思维导图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值