glxhyt
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
15 随笔 :: 0 文章 :: 4 评论 :: 0 Trackbacks
<
2011年11月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2013年5月 (2)
2012年5月 (1)
2012年2月 (1)
2011年11月 (5)
2010年10月 (1)
2010年9月 (1)
2010年8月 (4)
搜索
最新评论
1. re: 【转】C/C++开源项目中的100个Bugs | WHO1753
.
--zgpxgame
2. re: 自己工作中犯的几个小问题
可以把你遇到的问题描述的详细点吗?
--钟谢伟
3. re: 自己工作中犯的几个小问题
评论内容较长,点击标题查看
--郭龙
4. re: 自己工作中犯的几个小问题
评论内容较长,点击标题查看
--钟谢伟
阅读排行榜
1. [转]二维数组和二级指针 (5580)
2. 一个简单的用c++写的log(1657)
3. linux 下的一个程序代码统计的程序(类图,时序图,测试例子,代码,心得)(1526)
4. 以前的一些mfc的笔记(关于孙鑫的那本书)(1119)
5. 【转】字符串查找算法总结(696)
评论排行榜
1. 自己工作中犯的几个小问题(3)
2. 【转】C/C++开源项目中的100个Bugs | WHO1753(1)
3. 【转】字符串查找算法总结(0)
4. 著名的Josephus问题(0)
5. 一个简单的用c++写的log(0)
链表
越来越感到自己基础差了
今天看到 李先静老师 系统程序员成长计划 那本书上写道
编写通用的链表的
于是自己练习写了一下,主要是 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
(
*
p
==
NULL)
{
*
p
=
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
=
(
*
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
<<
"
B
"
<<*
(
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
郭龙
阅读(281)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 郭龙