分类:
传说中的c
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "link_list.h"
#define my_malloc malloc
#define my_free free
//定义一个形状
struct rect
{
int x;
int y;
int m;
int h;
};
struct circle
{
int x;
int y;
};
struct shape
{
int type;
union
{
struct rect r;
struct circle c;
}u;
struct link_node link;
};
//创建一个空间
static struct shape* alloc_shape()
{
struct shape* one = my_malloc(sizeof(struct shape));
memset(one, 0, sizeof(struct shape));
return one;
}
//释放
static void free_shape(struct shape* a)
{
my_free(a);
}
//清理单链表中所有内存
static void All_shape(hhlinknode all)
{
if (!all)
{
return;
}
struct shape* elem = LINK_TO_ELEM(all, struct shape, link);
if (all->next)
{
All_shape(all->next);
}
free_shape(elem);
}
int main()
{
hhlinknode Thead = NULL;
struct shape* shapeone = alloc_shape();
shapeone->type = 1;
list_insert_head(&Thead, &shapeone->link);
shapeone = alloc_shape();
shapeone->type = 2;
list_insert_head(&Thead, &shapeone->link);
shapeone = alloc_shape();
shapeone->type = 3;
list_insert_tail(&Thead, &shapeone->link);
hhlinknode walk = Thead;
while (walk)
{
//通过偏移指针获取到类型
struct shape* elem = LINK_TO_ELEM(walk, struct shape, link);
//struct shape* elem = ((struct shape*)((unsigned char*)walk - (unsigned char*)(&((struct shape*)NULL)->link)));
printf("%d \n", elem->type);
walk = walk->next;
}
list_insert_remove(&Thead, &shapeone->link);
All_shape(Thead);
system("pause");
return 0;
}单链表:
link_list.h
#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_
typedef struct link_node{
struct link_node* next;
}hlinknode,*hhlinknode;
typedef struct link_node *list_head;
//单链表头部添加
void list_insert_head(hhlinknode* header, hhlinknode node);
//单链表尾部添加
void list_insert_tail(hhlinknode* header, hhlinknode node);
//单链表指定节点删除
void list_insert_remove(hhlinknode* header, hhlinknode node);
//#define LINK_TO_ELEM(link,elem_type,mem_name) (((elem_type)*)(((unsigned char*)link)-(unsigned char*)(&((elem_type*)NULL)->mem_name)))
//通过指针
#define LINK_TO_ELEM(link,elem_type,mem_name) \
((elem_type*)((unsigned char*)link - (unsigned char*)(&((elem_type*)NULL)->mem_name)));
#endiflink_list.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "link_list.h"
void list_insert_head(hhlinknode* header, hhlinknode node)
{
hhlinknode* walk = header;
node->next = *walk;
*walk = node;
}
void list_insert_tail(hhlinknode* header, hhlinknode node)
{
hhlinknode* walk = header;
while (*walk)
{
walk = &((*walk)->next);
}
node->next = NULL;
*walk = node;
}
void list_insert_remove(hhlinknode* header, hhlinknode node) {
hhlinknode* walk = header;
while (*walk)
{
if (*walk==node)
{
*walk = node->next;
node = NULL;
return;
}
//这里必须要改指针的指针,不是改指针的值
walk = &(*walk)->next;
}
}欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256
50010702506256
欢迎加群交流技术