用 union 将 单链表 模块化

原创 2015年07月10日 15:12:28

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef unsigned int uint32_t;
typedef char         uint8_t;
typedef unsigned short uint16_t;

typedef struct _BOOK{
	char name[32];
	uint32_t price;

}Book;

typedef struct _Game{
	char name[32];
	uint32_t price;

}Game;


typedef union _messdata{
	Book* book;
	Game* game;
	
}messdata;

typedef enum _messtype{
	em_info_unable = 0,
	BOOK_TYPE = 1,
	GAME_TYPE	
}messtype;


typedef struct __Msg
{
	messdata node; //用联合将所有的变量都封装起来了
	uint8_t type;
	struct __Msg* next;
	struct __Msg* pre;
}Msg;

typedef struct List{
	Msg*  msg;
	uint32_t  list_len;
	 Msg* head;
	 Msg* cur;
	 Msg* tail;
}List;

Msg *xmlmess_node_alloc(messtype type)
{
    if (em_info_unable != type)
    {
        Msg *node = (Msg *)malloc(sizeof(Msg));       
        if (NULL != node)
        {
            node->type = type;
            node->next     = NULL;            
            switch (type)
            {
                case BOOK_TYPE:
                    node->node.book = (Book *)malloc(sizeof(Book));
                    break;                   
                case GAME_TYPE:
                    node->node.game = (Game *)malloc(sizeof(Game));
                    break;                   
       
                default: break;    
            }
        }
        
        return node;
    } 
    return NULL;
}



//create a list for xmlmess
int create_list(List **pplist)
{
    if (NULL != pplist)
    {
        List *listtemp = (List *)malloc(sizeof(List));
        if (NULL != listtemp)
        {
            listtemp->head = listtemp->cur = listtemp->tail = NULL;
					  listtemp->list_len = 0;
            *pplist = listtemp;            
            return 0;
        }
    }    
    return -1;
}


// add alist 

int append_list(List* list, Msg* node)
{
	if(NULL == list || NULL == node)
		return -1;
	
	if (NULL == list->tail)
	{
		list->head= list->cur = list->tail = node;
		list->list_len = 1;
	}
	else
	{
		list->tail->next = node;
		list->tail		 = node;
		++list->list_len;
	}
	return 1;

}

int travel_list(List* list)
{
	if(list->list_len == 0)
		return ;
	else
	{
		Msg* tmp = list->head;
		while(tmp)
		{
			//printf("111111111\n");
			tmp = tmp->next;
		}
	}
}


int main()
{
	List* list = NULL;

	if( create_list(&list) < 0)
		printf("create list failed\n");
	
	Msg* msg = xmlmess_node_alloc(BOOK_TYPE);
	msg->type = BOOK_TYPE;
	memcpy(msg->node.book->name, "lcf", 4);
	msg->node.book->price = 32;

	append_list(list, msg);
	
	travel_list(list);
	
}

一个通用链表模块(C语言)

1)把所有DBG和ERR改成printf; 2)COMMOM_Malloc改成malloc; 3)COMMON_Free改成free; 4)编译Ok;#ifndef __LIST_H__ #de...

内存链表union类型节省内存

我在阅读《STL源码剖析》中看到关于内存组织成空闲链表的结构: union obj{ union obj* next; char client_data[1]; }; 使用u...

动态链表的增删改查,打印销毁等基本操作及代码模块化(完整C语言代码!)

链表的增删改查,打印销毁等等基本操作 代码模块化 所有操作实现的完整C语言代码...

可视化的带头结点的单链表构造

  • 2017年05月30日 14:30
  • 178KB
  • 下载

有表头行与无表头行的内表在模块化中的应用(ABAP)

PROGRAM SAPMZTST. TYPES: BEGIN OF LINE,          COL1 TYPE I,          COL2 TYPE I,        END O...

114 Flatten Binary Tree to Linked List 二叉树到单链表的扁平化处理

给定一个二叉树,在已有的空间内进行扁平化生成一个单链表

单链表快速排序

  • 2017年11月03日 09:36
  • 3KB
  • 下载

理解模块化和依赖管理(一)

js模块化与依赖管理
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 union 将 单链表 模块化
举报原因:
原因补充:

(最多只允许输入30个字)