C语言中指针链表的学习探讨
2013-08-14刘山根
摘 要:指针链表是一种最简单也是最常用的动态数据结构,它是对动态获得的内存进行组织的一种结构。本文通过教学实践,通过图示法从基本概念的理解入手,并深入讲解动态链表的建立,插入和删除,在教学过程中起到了良好的效果。
关键词:动态;链表
中图分类号:TP311.12
C语言中存储数据的结构用的最普遍的是数组,包括简单类型的数组,指针数据和结构体数组等,但是他们在实际应用中,会因为实现定义过大的数组容量而造成内存的浪费,或者因为保守的预测分配而满足不了实际使用的要求,这时就需要另一种方法来解决这个问题,这就是动态数据结构和动态分配内存技术。链表就是这样一种最简单的动态数据结构。那么如何让学生能够很好的学习并掌握它,本人就近几年的教学过程中经过探讨,采用了图示法进行教学,效果很好。
1 基本概念的理解
1.1 指针的理解
(1)指针与简单变量。通过图1所示理解指针与简单变量的关系,当把变量i的地址存入指针变量p1后,就可以说这个指针指向了该变量。
如需要指向下一个元素,只需要指针往后移动即可!
1.2 结构体的理解
(1)结构体类型。结构体类型是一种专门组织和处理复杂关系的数据结构,是一种自定义类型。同一个数据对象由于应用不同定义的类型也有所不同。比如处理学生的信息,可以有很多种方式:
结构体中的成员名可增,可减,形成新的结构体类型。
(2)结构体变量与数组。以上是结构体类型的定义,变量定义方式有三种,这里不一一举例,可根据自己的个人习惯选择不同的定义方式。比如上面两个类型,分别定义简单变量,可这样定义:
struct student s1,s2; struct stu s3,s4;
如定义数组,结合前面所学数组的知识,可这样定义:
struct student s[10]; struct stu s1[20];
2 指针链表
掌握了前面指针和结构体的知识内容,对于指针链表的理解和掌握是非常重要的。
2.1 指针链表的定义
这里主要讲解单项链表结点的结构体类型的定义,对于初学者掌握了这种定义,对于以后学习更为复杂的链表知识的理解是很有帮助的。
单项链表结点的定义:
struct node
{
int data; //存放的数据,可以定义其他更为复杂的数据结构
struct node *next; //指向struct node类型数据,用此建立链表
};
2.2 指针链表的建立
定义好类型后,再定义变量,并将链表建立起来,形成整数数据按升序建立的数据链,下面通过函数create来实现链表的建立。
struct node *create()
{
struct node *head,*p,*q,num;
head=NULL;
scanf("%d",#);
while(num!=0)
{
p=(struct node *)malloc(sizeof(struct node ));
if(p==NULL)
{
printf("Allocation failure\n");
exit(0);
}
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
}
return head;
}
2.3 指针链表的插入
链表建立完成后,最常用的操作之一就是对链表的数据进行增加,也就是插入操作,具体程序通过insert函数实现。
struct node*insert(struct node*head,sturct node*r,int*x)
{
struct nod *p,*q;
if(head==NULL)
{
head=r;
r->next=NULL;
}
else
{
p=head;
while(*x>p->data&&p-;>next!=NULL)
{
q=p;
p=p->next;
}
if(*x
{
if(p==head)
head=r;
else
q->next=r;
p->next=p;
}
else
if(p==NULL)
{
p->next=r;
r->next=NULL;
}
return head;
}
2.4 指针链表的删除
对于链表中数据的删除也是链表数据中操作的重点,具体实现过程通过函数deletenode实现。
struct node*deletenode(struct node*head,int*x)
{
struct nod*p,*q;
if(head==NULL)
{
printf("This is a empty list.");
return head;
}
p=head;
while(*x!=p->data&&p-;>next!=NULL)
{
q=p;
p=p->next;
}
if(*x==p->data)
{
if(p==head)
head=p->next;
else
q->next=p->next;
free(p);
}
else
printf("NOT FOUND");
return head;
}
3总结
单向结点链表的主要操作就是建立,插入和删除数据,而且是链表当中最简单的一种形式,只有理解和掌握单向结点链表的基本操作,才有可能处理更为复杂的数据对象,在课堂上通过以上三个函数的编写与引导,学生对于链表有了初步的认识,并起到了良好的效果。
参考文献
[1]杜友福.C语言程序设计[M].北京:科学出版社,2012.
[2]龚民,朱秀兰.C语言程序设计教学探讨[J].电脑知识与技术,2009.
作者简介:刘山根(1976.8-),男,籍贯:河南新乡,职务:广东省华侨职业技术学校教务科副科长。