glxhyt

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  15 随笔 :: 0 文章 :: 4 评论 :: 0 Trackbacks

越来越感到自己基础差了

今天看到 李先静老师 系统程序员成长计划 那本书上写道 编写通用的链表的
于是自己练习写了一下,主要是 void* --> int*  int*--> void*
没想到指针的生命周期,整晕了,调试了好久。 

 typedef struct tagNode_t
{
    struct tagNode_t *pPre;
    struct tagNode_t *pNex;
    void * pData;
}Node_t;

主要是因为 当时把 void * pData;当成int一样赋值
pTemp->pData = (void*)&i;
没有考虑到i的生命周
//编写通用的链表的定义
//1

#if 0
typedef 
int Type;
typedef 
struct tagNode_t
{   
    
struct tagNode_t *pstPre;
    
struct tagNode_t *pstNex;
    Type   ElemType;
}
Node_t;

//2 good
//存入时拷贝一份数据,保存数据的指针和长度。
//考虑到拷贝数据会带来性能开销,不合符C      
//语言的风格,而且C 语言中没有构造函数,
//实现深拷贝比较麻烦,所以在C 语言中以这种
//实现的链表很少见


typedef 
struct tagNode_t
{
    
struct tagNode_t *pstPre;
    
struct tagNode_t *pstNex;  
    
void * pData;
    
int    iLength;
}
Node_t;

#endif

//3 best
/*
只是保存指向对象的指针,存取效率高,
是C语言中常见的做法。在存放整数时,
可以把void*强制转换成整数使用,
以避免内存分配(在现实中,90%以上的情况,
链表都是存放结构的)。
*/

#include 
<iostream>
using namespace std;


typedef 
struct tagNode_t
{
    
struct tagNode_t *pPre;
    
struct tagNode_t *pNex;
    
void * pData;
}
Node_t;

typedef 
struct tagList_t
{
    Node_t pHead;
}
List_t;

#if 0
#define LIST_OK 1
#define LIST_NG 0

//tagStautus_u
#endif

typedef 
enum tagStatusEnum
{
    LIST_NG 
= 0,
    LIST_OK,
}
StatusEnum;

//typedef StatusEnum (pFun *)(void * data);
typedef StatusEnum (*pFun ) (void * data);

#if 0
StatusEnum CreateList(Node_t 
**p , int i);
#else
StatusEnum CreateList(Node_t 
*p , int *i); 
#endif

StatusEnum PrintList(List_t 
*p, pFun print);

StatusEnum DeleteList(List_t 
*p);

StatusEnum PrintStatus(
void* p);

//LIST_t list;  
#if 0
StatusEnum CreateList(Node_t 
**p , int i)
#endif
StatusEnum CreateList(Node_t 
*p , int *i)  
{
    Node_t 
*pTemp = new Node_t;
    pTemp
->pPre  = NULL;
    pTemp
->pNex  = NULL;
    pTemp
->pData = i;
    
//NULL List Insert
#if 0
    
if (*== NULL)
    
{
        
*= pTemp;
        
//list.pHead = pTemp;
        (*p)->pNex = NULL;
        (
*p)->pPre = NULL;
    }
 
    
    
//Tail Insert
    
    
//pTemp->pNex = *p->pNex;
    pTemp->pPre = *p;
    (
*p)->pNex    = pTemp;
    
//pTemp->pNex->pPre = pTemp;
    
    
//Move Tail
    *= (*p)->pNex;
#endif
    pTemp
->pNex = (p)->pNex;
    (p)
->pNex  = pTemp;
    pTemp
->pPre = p;
    
    
if (NULL != pTemp->pNex)
    
{
        pTemp
->pNex->pPre = pTemp;
    }

    
return LIST_OK;
}


int main(int argc, char ** argv)
{
    
   
// Node_t *pRoot = NULL;
    List_t list;
    (list.pHead).pPre 
= NULL;
    (list.pHead).pNex 
= NULL;
    (list.pHead).pData 
= NULL;
    
   
// for (int i = 0; i < 5; ++ i)
   
// {
       
// CreateList(&pRoot, i);
#if 0
        CreateList(
&((list.pHead).pNex), i);
#endif
      
static int i = 3;
      
static  int j = 4;
        CreateList(
&(list.pHead), &i);     
        CreateList(
&(list.pHead), &j);    
    
//}
    
    PrintList(
&list, PrintStatus);
    
    DeleteList(
&list);
    
    
return 0;
}


StatusEnum PrintList(List_t 
*p, pFun print)
{
    Node_t 
*pTemp = p->pHead.pNex;
    
while ( NULL != pTemp)
    
{
        print(pTemp
->pData);
        pTemp 
= pTemp->pNex;
    }

    
    
return LIST_OK;
}



StatusEnum PrintStatus(
void* p)
{
    
//cout<<"A "<<(int) (*p);    
    cout<<""<<*(int*)p<<endl;
    
return LIST_OK;
}



StatusEnum DeleteList(List_t 
*p)
{
    Node_t 
*pTemp = p->pHead.pNex;
    Node_t 
*pCur = NULL;
    
while ( NULL != pTemp)
    
{
        pCur 
= pTemp;
        pTemp 
= pTemp->pNex;
        delete pCur;
    }

    
    
return LIST_OK;
}




               
posted on 2011-11-27 16:02 郭龙 阅读(285) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理