C链表重构

C语言学生信息管理系统:从数组到链表的3种数据结构重构对比 本文详细对比了C语言学生信息管理系统中静态数组、动态数组和链表三种数据结构的实现方案,分析其内存管理效率、操作时间复杂度和扩展性等核心考量。通过具体代码示例和性能分析,帮助开发者理解不同数据结构对程序性能的影响,优化系统设计。 阅读详情

/*这次重写主要是为了增加结构的通用性、为了照顾初学的朋友我保
*留原来的代码,那个看起来更容易被初学者理解.代码中的mian函数
*只是简单的测试,大家可以根据需要自行修改.*/

————————————————lis.h——————————————

#ifndef LIST_H

#define LIST_H

 

/*定义函数状态*/

#ifndef OK

#define ERR -1

#define OK 1

#endif

typedef int status;            /*函数状态*/

typedef struct listitem {

    void            *date;    /*节点数据*/

    int              size;

    struct listitem *next;    /*指向下个节点*/  

} list_node;//链表节点

void* copy_node( int, void* );

status destroy_node( void* );

typedef struct {

    struct listitem  *ptr;    /*链表头指针*/

    int              size;    /*链表长度*/

} list;//链表

 

list* list_init ( void );     /*初始化*/

status list_destroy( list* ); /*销毁*/

status add_node( list*, void*, int );  /*加入一个节点*/

status delete_all( list* );//清空

status delete_node( list*, list_node* ); /*删除一个节点*/

status insert_node( list*, const list_node*, void*, int );

                                                                       /*插入一个节点*/

list_node* find_node( const list*,

                      bool (*)( const void*, const void* ),

                      void* ); /*查找*/

status list_print( const list*,

                               void (*)( void*, const char*),

                          const char* );/*打印*/

 

#endif

 

_________________________________list_node.c_____________________________________

#include <malloc.h>

#include "list.h"

void* copy_node( int size, void *date )

{

    void *p = malloc( size );

    if( size == sizeof(int) )

         *(int*)p = *(int*)date;

     else if ( size == sizeof(char) )

        *(char*)p = *(char*)date;   

     else if( size == sizeof(float) )

        *(float*)p = *(float*)date;

    else if( size == sizeof(double) )

        *(double*)p = *(double*)date;

       

    return p;

}   

status destroy_node( void *p )

{

    if(p != 0)

       free(p);

    return OK;

}   

____________________________list.c________________________________________

#include <stdio.h>

#include <stdlib.h>

#include "list.h"

list* list_init ( void )

{

    list *p = ( list* )malloc( sizeof( list ) );

    if( p == 0 )

       return 0;

    p->ptr = 0;  

    p->size = 0;

    return p;

}

 

status list_destroy( list *pev )

{

    if( pev == 0 )

       return ERR;

    delete_all( pev );

    free( pev );

    return OK;

}

 

status add_node( list *p, void *date, int size )

{

    list_node *pev =

       ( list_node* )malloc( sizeof( list_node ) );

    if( pev == 0 )

       return ERR;

    pev->date = copy_node( size, date );

    pev->next = p->ptr;

    p->ptr = pev;

    p->size++;

    return OK;

}

 

status delete_node( list *p, list_node *pev )

{

    list_node *temp = pev;

    if( pev == 0 )

       return ERR;

    pev = temp->next;

    destroy_node( temp->date );

    free( temp );

    p->size--;

    return OK;

}

 

status delete_all( list *pev )

{

    int ix;

    if( pev == 0 )

       return ERR;

    if( pev->size == 0 )

       return ERR;

    for( ix = 0; ix < pev->size; ++ix, ++pev->ptr )

       delete_node( pev, pev->ptr );

    return OK;

}

status insert_node( list *p, list_node* pev,

                                   void *date, int size )

{

    if( p == 0 )

       return ERR;

    if( pev == 0 )      

       add_node( p, date, size );

    else

    {

       list_node *pv =

         ( list_node* )malloc( sizeof( list_node ) );

       if( pev == 0 )

           return ERR;

       pv->date = copy_node( size, date );

       pv->next = pev->next;

       pev->next = pv;

       p->size++;

    }

    return OK;

}

 

list_node* find_node( const list *pev,
         bool (*f)( const void*, const void* ), 

                   void *date )

{

    int ix;

    list_node *p = pev->ptr;

    for( ix = 0; ix < pev->size; ++ix )

       if( (*f)(p->date, date) )

           return p;

       else

           p = p->next;

    return 0;

}

 

status list_print( const list *pev,
            
void (*pprint)( void*, const char* ), 
         
  const char *ch )

{

    int ix;

    list_node *p = pev->ptr;

    if( pev == 0 )

       return ERR;

    if( pev->size == 0 )

       return OK;   

    for( ix = 0; ix < pev->size; ++ix )

    {

       (*pprint)( p->date, ch );

       printf( "/t" );

       p = p->next;

    }

    printf( "/n" );

    return OK;

}

____________________________ios.h_____________________________

#ifndef IOS_H

#define IOS_H

void output( void*, const char* );

void input( void*, const char* );

#endif

__________________________ios.c___________________________________

#include <stdio.h>

#include <string.h>

#include "ios.h"

 

void output( void* date, const char *cnt )

{

    if( strcmp(cnt, "%d") )

        printf( cnt, *(int*)date );

    else if( strcmp(cnt, "%c") )

        printf( cnt, *(char*)date );   

    else if( strcmp(cnt, "%s") )

        printf( cnt, *(char**)date );

    else if( strcmp(cnt, "%f") )

        printf( cnt, *(double*)date );

}

void input( void* date, const char *cnt )

{

    if( strcmp(cnt, "%d") )

        scanf( cnt, (int*)date );

    else if( strcmp(cnt, "%c") )

        printf( cnt, (char*)date );       

    else if( strcmp(cnt, "%s") )   

        scanf( cnt, (char**)date );

    else if( strcmp(cnt, "%f") )

        scanf( cnt, (double*)date );

}   

_____________________________maim.c______________________________________

#include <stdio.h>

#include <stdlib.h> 

#include "list.h"

#include "ios.h"

 

 

int main()

{

    list *mylistp = list_init();

    for( int i = 0; i < 10; ++i )

    {

        char a = 'a' + i;

        add_node( mylistp,&a, sizeof(a) );

    }

    list_print( mylistp, output, "%c" );

    delete_all( mylistp );  

       system( "pause" );

       return 0;           

}

 

【C++】双向链表 逆序建立一个双向链表,该链表从第二个结点至表尾递增有序,将第一个结点删除并插入到适当位置,使整个链表仍然递增有序。 阅读详情

相关推荐

从C语言的角度重构数据结构系列(四)-静态链表&动态链表

前言 是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素。 在这里给自己打个广告,需要的小伙伴请自行订阅。 python快速学习实战应用系列课程 https://blog.csdn.net/wenyusuran/category_2239261.html 手把手教你ML机器学习算法源码全解析 https://blog.csdn.net/wenyusuran/category_2239263.html 1.静态链表及其创建 静态链表,也是线性

wenyusuran的专栏 1309

C语言—链表

【C语言】—链表 创建,遍历,增删改查 链表是一种数据结构,是一种数据存放的思想;

weixin_73588765的博客 2万+

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 732

C语言链表详解(通俗易懂)

线性表是实际中广泛应用的重要数据结构,本文用通俗易懂的方法讲解它。

weixin_61661271的博客 5万+

C语言数据结构——链表

大家好,本篇文章主要带领大家了解一下什么是链表链表的两个主要结构,以及链表和顺序表的差别。

zcxmjw的博客 2万+

链表(C语言版)超详细讲解

而如果使用头插法,则需要遍历到链表的第一个节点,时间复杂度为O(n),而且尾插法是由数据插入的顺序依次存储的,查找起来会更加方便。1、首先我们定义两个指针(x1,p),x1作为头指针指向头结点(尾插法时不要移动头指针,我们只需移动p即可),p始终指向尾结点(这里我们初始化指向头结点),再申请一块结点并用x指向它。这样我们基础工作完成。

h220321204的博客 1万+

C语言之链表详解

链表是一种基本的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。链表的特点是可以动态添加和删除节点,而不需要预先知道数据的数量。与数组不同,链表中的节点不一定是连续的存储空间,因此可以有效地利用内存空间。int val;

Wang_XB_3434的博客 7941

C代码_链表精粹

一下这段代码仔细研读、不错 #include #include typedef struct node { float v; struct node * next; struct node *left, *right; }Node, *pNode,*List; List create(void) { List head, p, pre; float

xzm_cn 622

PAT 1025 反转链表

#include #include #define MAXNODE 100001 struct Node { int data; char addr[8]; char next[8]; }node[MAXNODE]; struct Node *pnode[MAXNODE]; int main(void) { char ad[8]; int nnode, k; in

汪少升的博客 462

字节跳动实习题之C语言数据结构

C语言数据结构实习题篇: 已知有如下单链表(a1,a2,a3,…an)n为偶数,要求写出一个时间复杂度为O(n),辅助空间为O(1)的算法,将上述单链表转化成偶数下标倒序排列,奇数下标正序排列的单链表。 #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int ElementType...

Solitary___的博客 1337

浙大版《C语言程序设计(第3版)》题目集 - 习题11-7 奇数值结点链表(20 分)

题目链接:点击打开链接 题目大意:略。 解题思路:题目说删除了,其实可以转化为再搞一个获取奇数时的做法来做偶数的情况,最后把地址赋值给L,这样思路就简单许多~。还有这里带两个星号的L,其实多了一个星号是因为传参时,传进去的是指针变量的地址(此地址非内容)。 AC 代码 struct ListNode *readlist() { struct ListNode *...

3041

PAT_甲级_1133 Splitting A Linked List (25point(s)) (C++)【链表重构

目录 1,题目描述 2,思路 3,AC代码 4,解题过程 第一搏 1,题目描述 Sample Input: 00100 9 10 23333 10 27777 00000 0 99999 00100 18 12309 68237 -6 23333 33218 -4 00000 48652 -2 -1 99999 5 68237 27777 11 48652 12309 7 3...

&再见萤火虫&的博客 226

重排链表-c语言链表法解决

重排链表-c语言链表法解决 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 对于这一题,我们采用先用一个链表反向存储目标链表,之后,我们同时遍历一个顺向的一个逆向的链表进行重建原链表,得到结果 代码如下: /** * Definition for singly-linked

weixin_43327597的博客 2112

从古董代码到现代工程——C语言链表实现高精度加法器的重构之旅

本文记录了将一份使用C语言链表实现超大整数加法的古董代码,重构为符合现代工程标准的高精度计算器的完整过程。通过修复内存泄漏、标准化语法、模块化拆分及引入CMake与Git,不仅解决了加法计算器的跨平台与健壮性问题,更展现了从功能实现到工程化思维的升级路径。

lilh34434的博客 371

C语言链表学习笔记

问题引入:预先无法知道数组的大小,不能分配一块连续的内存用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。 即在结点结构中定义一个成员

wangjun_huster的博客 946

数组链表的一个奇淫巧技

题意翻译 你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下。你却不知道此问题,而是专心致志地打稿子,甚至显示器都没开。当你打开显示器之后,展现你面前的数一段悲剧文本。你的任务是在显示器打开前计算出这段悲剧的文本。 给你一段按键的文本,其中’[‘表示Home键,’]'表示End键,输入结束标志是文件结束符(EOF)。 输出一行,即这段悲剧文本。 翻译贡献者UID:71371 ...

weixin_43191153的博客 161

【Python】-- 趣味代码 - 发牌游戏

Python -- 趣味代码 - 发牌游戏

银尘博客 335

小米REC界面读取型号 序列号 处理器 版本号的小工具

资源说明:支持在官方rec和第三方rec读取支持读取型号 序列号 当前版本号需要安装好联机驱动。手机进入rec界面 驱动正常就可以读取到方便操作 带演示读取图

上一篇: 《programming windows》笔记1
下一篇: 《c++ primer》读书笔记12
owl2008
博客等级 码龄23年 16粉丝 65原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值