C语言-单向链表

C语言-单向链表,第1张

C语言-单向链表

#include 
#include 
#include 

struct 结点
{
    int 数据;   //数据域
    struct 结点 *下一个;   //指针域
};

struct 结点 *创建链表();
struct 结点 *创建结点(int 数据);
void 遍历链表(struct 结点 *头结点);
struct 结点 *查找结点(struct 结点 *头结点, unsigned int  序号);
bool 删除结点(struct 结点 *头结点, unsigned int  序号);
bool 插入结点(struct 结点 *头结点, struct 结点 *被插入的结点, unsigned int  序号);
int 取链表结点数(struct 结点 *头结点);
void 追加结点(struct 结点 *头结点, struct 结点 *被追加的结点);
void 释放链表(struct 结点 *头结点);

int main(void)
{
    struct 结点 *头指针;
    头指针 = 创建链表();
    插入结点(头指针, 创建结点(123), 1);
    插入结点(头指针, 创建结点(456), 2);
    插入结点(头指针, 创建结点(789), 3);
    插入结点(头指针, 创建结点(345), 4);
    printf("第一次输出:n");
    遍历链表(头指针);
    删除结点(头指针, 2);
    printf("第二次输出:n");
    遍历链表(头指针);
    插入结点(头指针, 创建结点(999), 3);
    printf("第三次输出:n");
    遍历链表(头指针);
    int 长度 = 取链表结点数(头指针);
    printf("链表长度为:%dn", 长度);
    追加结点(头指针, 创建结点(135790));
    printf("第四次输出:n");
    遍历链表(头指针);
    释放链表(头指针);

    return 0;
}

struct 结点 *创建链表()
{
    struct 结点 *头结点 = (struct 结点 *)malloc(sizeof(struct 结点));
    头结点->下一个 = NULL;
    return 头结点;
}

struct 结点 *创建结点(int 数据)
{
    struct 结点 *结点 = (struct 结点 *)malloc(sizeof(struct 结点));
    结点->数据 = 数据;
    结点->下一个 = NULL;
    return 结点;
}

void 遍历链表(struct 结点 *头结点)
{
    struct 结点 *临时 = 头结点->下一个;

    for(int 计数 = 1; 临时; 计数++)
    {
        printf("第%d个结点的数据域为:%dn", 计数, 临时->数据);
        临时 = 临时->下一个;
    }
}

struct 结点 *查找结点(struct 结点 *头结点, unsigned int  序号)
{
    struct 结点 *临时 = 头结点;

    for(unsigned int 计数 = 0; 计数 < 序号 && (临时 = 临时->下一个); 计数++)
        ;
    return 临时;
}


bool 删除结点(struct 结点 *头结点, unsigned int  序号)
{
    struct 结点 *临时 = 头结点, *被删除结点;

    for(unsigned int 计数 = 0; 计数 < 序号 - 1 && (临时 = 临时->下一个); 计数++)
        ;
    if(临时 == NULL)
        return false;
    else
    {
        if(临时->下一个 == NULL)
            return false;
        else
        {
            被删除结点 = 临时->下一个;
            临时->下一个 = 临时->下一个->下一个;
            free(被删除结点);
            return true;
        }
    }
}

bool 插入结点(struct 结点 *头结点, struct 结点 *被插入的结点, unsigned int  序号)
{
    struct 结点 *临时 = 头结点, *临时位置;

    for(unsigned int 计数 = 0; 计数 < 序号 - 1 && (临时 = 临时->下一个); 计数++)
        ;
    if(临时 == NULL)
        return false;
    else
    {
        临时位置 = 临时->下一个;
        临时->下一个 = 被插入的结点;
        被插入的结点->下一个 = 临时位置;
        return true;
    }
}

int 取链表结点数(struct 结点 *头结点)
{
    struct 结点 *临时 = 头结点;
    unsigned int 计数;

    for(计数 = 0; (临时 = 临时->下一个); 计数++)
        ;
    return 计数;
}

void 追加结点(struct 结点 *头结点, struct 结点 *被追加的结点)
{
    struct 结点 *临时 = 头结点;

    while(临时->下一个)
        临时 = 临时->下一个;
    临时->下一个 = 被追加的结点;
}

void 释放链表(struct 结点 *头结点)
{
    struct 结点 *临时 = 头结点->下一个, *交换;

    while(临时)
    {
        交换 = 临时;
        临时 = 临时->下一个;
        free(交换);
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5702570.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存