您的位置:首页 > 编程语言 > C语言/C++

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

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

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: