C语言中指针链表学习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中指针链表的学习探讨
摘要:指针链表是一种最简单也是最常用的动态数据结构,它是对动态获得的内存进行组织的一种结构。本文通过教学实践,通过图示法从基本概念的理解入手,并深入讲解动态链表的建立,插入和删除,在教学过程中起到了良好的效果。
关键词:动态;链表
中图分类号: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”,&num);
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;
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)
{
p=p->next;
}
if(*xdata)
{
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);
}