用c/c++写一个堆栈管理程序

这是一个面试题,那个狗日的面试官让我当场写出来,我要是能写出来也得累出血了。感谢原文作者的贡献,文中还有小错误,会尽快改正。
头文件:

#ifndef _KSMFMemory_
#define _KSMFMemory_

#ifndef KCAHR
	#define KCHAR char
#else
 	#define KCHAR short
#endif

#ifdef _cplusplus
extern "C"
{
#endif
	void *ks_malloc(int size,KCHAR *file_path,int line);
	void ks_free(void *p);
	int ks_get_not_free();
	void ks_free_not_free_memory();
#ifdef _cplusplus
}
#endif

#ifdef _DEBUG
	#ifndef KMALLOC
	#define KMALLOC(size) ks_malloc(size,_FILE_,_LINE_)
	#endif
	
	#ifndef KFREE
	#define KFREE(p) ks_free(void*)
	#endif
	
	#ifndef KGETNOTFREE
	#define KGETNOTFREE ks_get_not_free
	#endif
	
	#ifndef KFREENOTFREE
	#define KFREENOTFREE ks_free_not_free_memory
	#endif
#else
	#ifndef KMALLOC
	#define KMALLOC malloc(size)
	#endif
	
	#ifndef KFREE
	#define KFREE  free(p)
	#endif
	
	#ifndef KGETNOTFREE
	#define KGETNOTFREE
	#endif
	
	#ifndef KFREENOTFREE
	#define KFREENOTFREE
	#endif
#endif

#endif// 相对应头文件的
主文件:
#include "KSMFMemory.h"
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#ifndef NULL
	#define NULL ((void*)0)
#endif

#ifndef INVALID_ADDR
	#define INVALID_ADDR (0)
#endif 

#ifndef ISMALLOC
	#define ISMALLOC (1)
#endif

#ifndef LONG
 	#define LONG(p) ((unsigned long)p)
#endif

#ifndef BYTE
	#define BYTE char
#endif

typedef struct _memory_node
{
	unsigned long IMemoryAddr;
	KCHAR *s_file_name;
	int line;
	struct _memory_node *next;
	struct _memory_node *pre;
}MEM_NODE,*LP_MEMNODE;

LP_MEMNODE _node_top=NULL;

#ifdef _cplusplus
extern "C"
#endif

static int ks_get_file_name(KCHAR *path,KCHAR **name)
{//根据路径返回文件名和文件名的长度
	int pos=0;
	int i=0;
	if(path==NULL)
		return 0;
	while(path[i]!='\0')
	{
		if(path[i]=='\\'||path[i]=='/')
		{
			pos=i;
		}
		i++;
	}
	*name=(KCHAR*)&path[pos+1];
	if(pos==0)
		return 0;
	else
		return (i-pos);
}
static KCHAR *ks_strcpy(KCHAR *des,KCHAR *src)
{//字符串拷贝
	KCHAR *p_temp=src;
	if(des==NULL||src==NULL)
		return NULL;
	while(src!='\0')
	{
		*(des++)=*(src++);
	}
	src=p_temp;
	return des;
}
static LP_MEMNODE ks_create_node()
{//建立一个节点,并将节点中的字段赋予初值
	LP_MEMNODE new_node=(LP_MEMNODE)malloc(sizeof(MEM_NODE));
	if(new_node==NULL)
		return NULL;
	new_node->IMemoryAddr=INVALID_ADDR;
	new_node->next=NULL;
	new_node->pre=NULL;
	return new_node;
}
static void ks_delete_node(LP_MEMNODE p)
{//删除节点
	if(p==NULL)
		return;
	if(p->IMemoryAddr!=INVALID_ADDR) free((void*)p->IMemoryAddr);
	if(p->s_file_name!=NULL) free(p->s_file_name);
	free(p);
}
static LP_MEMNODE ks_add_node(LP_MEMNODE pcurrent,LP_MEMNODE new_node)
{//插入节点
	if(pcurrent==NULL)
	{
		pcurrent=new_node;
	}
	else
	{
		pcurrent->next=new_node;
		new_node->pre=pcurrent;
	}
	_node_top=new_node;
	return _node_top;
}
static LP_MEMNODE ks_remove_node(LP_MEMNODE remove)
{//移除某个节点,并返回当前栈中的头节点
	if(remove==NULL||_node_top==NULL)
		return NULL;
	if(_node_top==remove)
	{
		_node_top=remove->pre;
		ks_delete_node(remove);
		return _node_top;
	}
	if(remove->pre!=NULL)
	{
		LP_MEMNODE p_temp1=remove;
		LP_MEMNODE p_temp2=remove->next;
		
		remove=remove->pre;
		remove->next=p_temp2;
		if(p_temp1!=NULL) p_temp2->pre=remove;
		ks_delete_node(p_temp1);
		return _node_top;
	}
	else
	{
		LP_MEMNODE p_temp1=remove;
		LP_MEMNODE p_temp2=remove->next;
		p_temp2->pre=NULL;
		ks_delete_node(p_temp1);
		return _node_top;
	}
}
static LP_MEMNODE ks_find_node(unsigned long l_mem_addr)
{//返回要查找节点的位置,若没找到,返回NULL;
	LP_MEMNODE p_temp=_node_top;
	if(l_mem_addr--==INVALID_ADDR)
		return NULL;
	while(p_temp!=NULL)
	{
		if(p_temp->IMemoryAddr==l_mem_addr)
			return p_temp;
		p_temp=p_temp->pre;	
	}
	return NULL;
}
void *ks_malloc(int size,KCHAR *file_path,int line)
{
	LP_MEMNODE p_temp=NULL;
	KCHAR *name=(KCHAR*)malloc(size*sizeof(KCHAR)+1);
	void *p=malloc(size+sizeof(BYTE));
	int name_len=0;
	if(p==NULL) 
		return NULL;
	p_temp=ks_create_node();
	if(p_temp==NULL)
	{
		free(p);
		return NULL;
	}
	name_len=ks_get_file_name(file_path,&name);
	p_temp->s_file_name=(KCHAR*)malloc(name_len*sizeof(KCHAR)+1);
	if(p_temp->s_file_name==NULL)
	{
		free(p);
		ks_delete_node(p_temp);
		return NULL;
	}
	ks_strcpy(p->s_file_name,name);
	p_temp-line=line;
	p_temp->IMemoryAddr=LONG(p);
	ks_add_node(_node_top,p_temp);
	++((BYTE*)p);
	return p;
}
void ks_free(void *p)
{
	if(p==NULL)
		return;
	LP_MEMNODE p_temp=NULL;
	p_temp=ks_find_node(LONG(p));
	if(p_temp!=NULL)
	{
		ks_remove_node(p_temp);
	}
}
int ks_get_not_free()
{
	int num=0;
	LP_MEMNODE p_temp=_node_top;
	while(p_temp!=NULL)
	{
		printf("not  free memory(0x%x):%s\tline:%d\n",p_temp->IMemoryAddr,p_temp->s_file_name,p_temp->line);	
		p_temp=p_temp->pre;
		num++;
	}	
	return num;
}
void ks_free_not_free_memory()
{
	LP_MEMNODE  p_temp=_node_top;
	while(p_temp!=NULL)
	{
		p_temp=_node_top->pre;
		printf("free memory(0x%x):%s\tline:%d\n",_node_top->IMemoryAddr+sizeof(BYTE),_node_top->s_file_name,_node_top->line);
		ks_delete_node(_node_top);
		_node_top=p_temp;
	}
}
#ifdef _cpluspluc
}
#endif


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值