c语言, 存放结构体的链表

在项目中,用到了链表,每次存储的数据结构可能不一样,写一个存储结构体的链表,想存储什么数据,可以放到结构体中,再保存到链表中。

使用方法:

  执行之前需要先调用 Init_RecordTable( sizeof(您的结构表));

#include <stdio.h> #include "system.h" //结构体指针指向的结构体的长度,必须初始化 static int structLen; static struct RecordTable { void *pObj ; struct RecordTable *front ; struct RecordTable *next ; } *ptable, *ptailtable, tableHead ; //初始化链表,必须先调用 void Init_RecordTable( int len ) { tableHead.front = null; tableHead.next = null; tableHead.pObj = null; ptable = ptailtable = &tableHead; structLen = len; } //获取链表的指向的结构体的值 void get_table_rno( void *pstr ) { memcpy( pstr, ptable->pObj, structLen ); } //获取链表的指向的结构体的值 void * get_table_pointer() { return ptable->pObj; } //转向一条记录 BOOL set_front_table() { if ( ptable->front != null ) { if ( ptable->front != &tableHead ) { ptable = ptable->front ; return LTRUE; } } return LFALSE; } //转下一条记录 BOOL set_next_table() { if ( ptable->next != null ) { ptable = ptable->next; return LTRUE; } return LFALSE; } //跳到链表头,查看时,需要先跳到链表头 BOOL set_top_table() { if ( tableHead.next == null ) return LFALSE; ptable = tableHead.next ; return LTRUE; } //跳到链表尾 BOOL set_bottom_table() { ptable = ptailtable ; } //追加记录 BOOL set_add_table( void *pstr ) { //申请自身结构体的空间 struct RecordTable *pTemptable = ( struct RecordTable* )( malloc( sizeof( struct RecordTable ) ) ); void *pobject = ( void* )( malloc( structLen ) ); //申请记录对象的空间 if ( pTemptable == null ) { if ( pobject != null ) free( pobject ); return LFALSE; } else if ( pobject == null ) { if ( pTemptable != null ) free( pTemptable ); return LFALSE; } if ( pstr == null ) { free( pTemptable ); free( pobject ); return LFALSE; } memcpy( pobject, pstr, structLen ); ptailtable->next = pTemptable; pTemptable->front = ptailtable; pTemptable->pObj = pobject; pTemptable->next = null; ptable=ptailtable = pTemptable; return LTRUE; } //修改当前链表节点的指向的结构体的值 void set_edit_table( void *pstr) { memcpy( ptable->pObj, pstr, structLen ); } //释放链表占用的空间 void set_free_table() { struct RecordTable *temptable; ptable =tableHead.next; while( ptable != null ) { temptable = ptable->next; free( ptable->pObj ); free( ptable ); ptable = temptable; } } //删除当前节点,指向下一节点 void set_delete_table() { struct RecordTable *temptable; //检测是否是头节点 if ( ptable->front != &tableHead ) { //检测是否是末节点 if ( ptable->next != null ) { //指向下一节点 ptable->front->next = ptable->next; temptable=ptable->next; free(ptable); ptable=temptable; } else { //末节点,指向上一节点 ptable->front->next = null; temptable=ptable->front; free(ptable); ptailtable=ptable=temptable; //指向末节点 } } else { //检测是否是末节点 if ( ptable->next != null ) { //指向下一节点 tableHead.next = ptable->next; temptable=ptable->next; free(ptable); ptable=temptable; } else { //空链表 tableHead.next=null; free(ptable); ptable = ptailtable = &tableHead; } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值