随笔 - 192,  文章 - 0,  评论 - 2,  阅读 - 25万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

linklist.h

复制代码
#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef int data_t;

typedef struct node{
    data_t data;
    struct node *next;
}NODE;

NODE *linklist_create();

int linklist_is_empty(NODE *head);
int linklist_is_full(NODE *head);

int linklist_length(NODE *head);
void linklist_clear(NODE *head);

int linklist_insert(NODE *head, data_t data, int offset);

int linklist_data_delete(NODE *head, data_t data);
int linklist_offset_delete(NODE *head, int offset);

int linklist_data_change(NODE *head, data_t old_data, data_t new_data);
int linklist_offset_change(NODE *head, data_t data, int offset);

int linklist_data_search(NODE *head, data_t data);
//NODE *linklist_data_search(NODE *head, data_t data);
data_t linklist_offset_search(NODE *head, int offset);

void linklist_show(NODE *head);
void linklist_destory(NODE **head);

void linklist_invert(NODE *head);

#endif
复制代码

linklist.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "linklist.h"

NODE *linklist_create()
{
    NODE *head = (NODE *)malloc(sizeof(NODE));
    if (NULL == head) {
        printf("malloc failed!\n");
        return NULL;
    }
    bzero(head, sizeof(NODE));

    head->data = -1;
    head->next = NULL;

    return head;
}

int linklist_is_empty(NODE *head)
{
    /*
    if (NULL == head->next) {
        return 1;
    }
    return 0;
    */

    return head->next == NULL;
}

int linklist_is_full(NODE *head)
{
    return 0;
}

int linklist_length(NODE *head)
{
    NODE *p = head->next;
    int len = 0;

    while (NULL != p) {
        len++;
        p = p->next;
    }

    return len;
}

void linklist_clear(NODE *head)
{
    NODE *p = head->next;
    NODE *q = NULL;

    while (NULL != p)  {
        q = p->next;
        free(p);
        p = q;
    }

    head->next = NULL;
}

int linklist_insert(NODE *head, data_t data, int offset)
{
    /*判断插入的位置是否有效*/
    int len = linklist_length(head);
    if (0 > offset || offset > len) {
        printf("offset invalid!\n");
        return -1;
    }

    /*给想要插入的元素开辟空间,并赋值*/
    NODE *p = (NODE *)malloc(sizeof(NODE));
    if (NULL == p) {
        printf("malloc failed!\n");
        return -1;
    }
    bzero(p, sizeof(NODE));

    p->data = data;
    p->next = NULL;

    /*找到插入位置的前一个位置*/
    NODE *q = head;
    int i;
    for (i = 0; i < offset; i++) {
        q = q->next;
    }

    /*在找到的位置后面插入结点*/
    p->next = q->next;
    q->next = p;

    return 0;
}

int linklist_data_delete(NODE *head, data_t data)
{
    /*找到想要删除的元素的位置*/
    int offset = linklist_data_search(head, data);
    if (-1 == offset) {
        printf("search failed!\n");
        return -1;
    }

    /*查找删除位置的前一个位置*/
    NODE *p = head;
    int i;
    for (i = 0; i < offset; i++) {
        p = p->next;
    }
#if 0
    NODE *p = head;
    while (NULL != p->next) {
        if (p->next->data == data) {
            break;
        }
        p = p->next;
    }
    if (p->next == NULL) {
        return -1;
    }
#endif

    /*让删除位置的前一个结点指向后一个结点的位置*/
    NODE *q = p->next;
    p->next = q->next;

    /*释放这个位置*/
    free(q);
    q = NULL;

    return 0;
}

int linklist_offset_delete(NODE *head, int offset)
{
    /*判断offset的值是否有效*/
    int len = linklist_length(head);
    if (0 > offset || offset > len-1) {
        printf("offset invalid!\n");
        return -1;
    }

    /*查找删除位置的前一个位置*/
    NODE *p = head;
    int i;
    for (i = 0; i < offset; i++) {
        p = p->next;
    }

    /*让删除位置的前一个结点指向后一个结点的位置*/
    NODE *q = p->next;
    p->next = q->next;

    /*释放这个位置*/
    free(q);
    q = NULL;

    return 0;
}

int linklist_data_change(NODE *head, data_t old_data, data_t new_data)
{
    /*找到想要修改元素的位置*/
    int  offset = linklist_data_search(head, old_data);
    if (-1 == offset) {
        printf("search failed!\n");
        return -1;
    }

    /*直接修改这个数据*/
    NODE *p = head->next;
    int i;
    for (i = 0; i < offset; i++) {
        p = p->next;
    }

    p->data = new_data;

    return 0;
}

int linklist_offset_change(NODE *head, data_t data, int offset)
{
    /*判断offset的值是否有效*/
    int len = linklist_length(head);
    if (0 > offset || offset > len-1) {
        printf("offset invalid!\n");
        return -1;
    }
    
    /*直接修改这个数据*/
    NODE *p = head->next;
    int i;
    for (i = 0; i < offset; i++) {
        p = p->next;
    }

    p->data = data;

    return 0;
}

int linklist_data_search(NODE *head, data_t data)
{
    /*从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置*/
    NODE *p = head->next;
    int offset = 0;

    while (NULL != p) {
        if (data == p->data) {
            return offset;
        }
        offset++;
        p = p->next;
    }

    return -1;
}
/*
NODE *linklist_data_search(NODE *head, data_t data)
{
    从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置
    NODE *p = head->next;

    while (NULL != p) {
        if (data == p->data) {
            return p;
        }
        p = p->next;
    }

    return NULL;
}
*/
data_t linklist_offset_search(NODE *head, int offset)
{
    /*判断offset的值是否有效*/
    int len = linklist_length(head);
    if (0 > offset || offset > len-1) {
        printf("offset invalid!\n");
        return -1;
    }

    /*找到这个位置,并返回这个位置的值*/
    NODE *p = head->next;
    int i;
    for (i = 0; i < offset; i++) {
        p = p->next;
    }

    return p->data;
}

void linklist_show(NODE *head)
{
    NODE *p = head->next;

    while (NULL != p) {
        printf("%d, ", p->data);
        p = p->next;
    }
    printf("\n");
}

void linklist_destory(NODE **head)
{
    linklist_clear(*head);

    free(*head);
    *head = NULL;
}

void linklist_invert(NODE *head)
{
    NODE *p = head;
    NODE *q = head->next;
    p->next = NULL;//意思是第一个插入的元素的指针位已经是空了(因为头插法第一个插入的元素会变成最后一个元素。)

    NODE *t = NULL;

    while (NULL != q) {
        t = q->next;

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

        q = t;
    }
}
复制代码

调用main.c

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>

#include "linklist.h"

int main()
{
    NODE *head = linklist_create();

    if (NULL == head) {
        printf("create failed!\n");
        return -1;
    }

    int n = 10;
    while (n--) {
        if (-1 == linklist_insert(head, n+1, 0)) {
            printf("insert failed!\n");
            break;
        }
    }
    linklist_show(head);

    if (-1 == linklist_insert(head, 100, 10)) {
        printf("insert failed!\n");
        return -1;
    }
    linklist_show(head);

    if (-1 == linklist_data_change(head, 10, 1000)) {
        printf("change data failed!\n");
        return -1;
    }
    linklist_show(head);
    
    if (-1 == linklist_offset_change(head, 100, 0)) {
        printf("change offset failed!\n");
        return -1;
    }
    linklist_show(head);
    
    if (-1 == linklist_data_delete(head, 100)) {
        printf("change data failed!\n");
        return -1;
    }
    linklist_show(head);
    
    if (-1 == linklist_offset_delete(head, 0)) {
        printf("change offset failed!\n");
        return -1;
    }
    linklist_show(head);

    linklist_invert(head);
    linklist_show(head);

    linklist_destory(&head);

    return 0;
}
复制代码

 

posted on   Malphite  阅读(251)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示