C语言入门教程-链表栈

电子常识

2651人已加入

描述

链表栈

创建一个指针,使它指向另一个指针,这是可能的,而且常常也是必要的。这一技术有时被称为句柄。在某些情况下,操作系统需要有自主移动堆上的内存块的能力,这时就要用到此技术。下面是一个指针的例子,它指向了另一个指针:

 

 
int **p; 
int *q; 
 
p = (int **)malloc(sizeof(int *)); 
*p = (int *)malloc(sizeof(int)); 
**p = 12; 
q = *p; 
printf("%dn", *q); 
free(q); 
free(p); 

 


 

Windows和Mac OS使用这种结构支持堆上的内存压缩。应用程序使用指针p,而操作系统负责管理指针*p。因为控制了*p,所以操作系统可以移动*p指向的内存块(**p),并将*p指向新地址,而这一切不会影响使用p的应用程序。在C中,这种指向指针的指针,还常常用于处理函数的指针参数。

指向包含指针结构体的指针
创建一个指针,使它指向一个包含指针的结构体,这也是可能的。下例的代码使用了上一节的Addr记录类型:

 

 
typedef struct 
{char name[21];char city[21];char phone[21]; char *comment;} Addr; 
Addr *s; 
char comm[100]; 
 
s=(Addr *)malloc(sizeof(Addr)); 
gets(s->name, 20); 
gets(s->city, 20); 
gets( s->phone, 20); 
gets(comm, 100); 
s->comment=
(char *)malloc(sizeof(char[strlen(comm)+1])); 
strcpy(s->comment, comm); 

 

指针s指向一个结构体,此结构体又包含一个指向字符串的指针:

 

 

本例中,如果不小心很容易将内存块丢失。例如下面的代码:

 

s=(Addr *)malloc(sizeof(Addr)); 
gets(comm, 100); 
s->comment=
(char *)malloc(sizeof(char[strlen(comm)+1])); 
strcpy(s->comment, comm); 
free(s); 

 

因为包含指向字符串指针的结构体先于字符串被释放,所以此程序产生了一个内存块泄漏,如下所示:

 

 

链接
最后,我们可以创建一种能够指向同类型结构体的结构体,这样就可以链接起一整串同类型的记录,构成一种称为链表的数据结构。

 

 
typedef struct 
{ char name[21]; char city[21]; char state[21]; Addr *next;} Addr; 
Addr *first; 

 

这是可以通过编译的。利用上面的代码,再加上一点编程经验,您就可以创建如下的数据结构:

 

 

动手一试
请为栈函数库添加dup、count和add函数,分别用于复制栈顶元素、返回栈包含元素的数目和将栈顶端的两个元素相加。
请为栈函数库编写一个测试程序和一个makefile。将栈函数库和测试程序一起编译,确定程序可以正确地工作。 
 

C常见错误
提及一个记录时(如上面的 (*p).i)时忘记加上括号。
分配了内存却无法释放。例如,在栈函数中不要写top=NULL,因为那样会导致无法访问需要被释放的内存。
忘记包含stdio.h。为使用NULL,请在涉及指针操作的源文件中包含stdio.h。 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分