在项目中,用到了链表,每次存储的数据结构可能不一样,写一个存储结构体的链表,想存储什么数据,可以放到结构体中,再保存到链表中。 使用方法: 执行之前需要先调用 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; } } }