摘 要:《数据结构》是计算机专业的专业基础课程,采用理论与实践相结合的教学模式,实践教学一般采用C语言作为算法的程序设计语言,在VC++环境下运行调试,其中指针和结构体的使用成为学生编写程序的难点,本文从指针和结构体的概念出发,讨论指针和结构体在数据结构实训中的应用。
关键词:数据结构;实践教学;指针;结构体;C语言
中图分类号:TP311.12
1 指针和结构体的概念
在程序中定义一个变量,如int x;在编译时系统就根据定义的变量类型,给这个变量分配相应的内存单元。内存中每个字节都有一个编号,称为“地址”,在地址所标识的内存单元中存放数据。在程序中,一般通过变量名对内存单元进行存取操作,称为“直接访问”,如x=7;printf(“%d”,x);假设定义一个变量p,用于存放整型变量x的地址,int*p=&x;则变量p称为“指针变量”,我们称指针p指向x。通过指针p访问x,称为“间接访问”,如*p。
因此定义指针变量的格式是:基类型 *指针变量名;
引用指针变量的格式是:*指针变量名。
结构体将不同类型的数据组合成一个有机的整体,定义一个新的数据类型,格式:typedef struct
{成员列表}结构体名;
结构体变量的引用格式:结构体变量名.成员名。
2 线性结构中指针和结构体的使用
线性结构中数据元素之间是1:1的线性关系,线性表是最基本的线性结构,有顺序存储结构和链式存储结构两种存储方法。顺序存储结构是在内存中用一段连续的存储单元来依次存储线性表的数据元素,用元素在机内的物理位置相邻表示逻辑相邻关系,常借助于数组来表示数据存储区域。因此顺序表类型定义如下:
#define MaxSize 100 // MaxSize是数组的容量,便于后期进行插入运算
typedef char DataType; //程序中的DataType设定为char型,便于统一修改
typedef struct{
DataType data[MaxSize];//data数组用于存放数据元素
int Last;//整型变量last存放当前顺序表中最后一个数据元素的下标值
}SeqList;//SeqList为顺序表的数据类型
SeqList*L;//定义一个指针变量L
L=new SeqList;//new用来申请顺序表的存储空间,L指向此顺序表
顺序表表长:L->Last+1
顺序表中的数据元素:L->data[0]~L->data[L->Last]
比如顺序表的插入运算Insert_SeqList(SeqList *L,int i,DataType x)基本语句如下:
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];//从最后一个元素到第i个元素逐一后移
L->data[i-1]=x; //在i位置处插入元素x
L->last++; //表长加1
链式存储结构是用一组任意的存储单元存放线性表的数据元素,逻辑次序和物理次序不一定相同,元素之间的逻辑关系用指针表示。单链表的类型定义如下:
typedef struct Node{
DataType data;//数据域,存储数据元素
struct Node * next;//指针域,存储后继结点的地址
}Lnode,*LinkList;
LNode*p;//定义一个LNode类型的指针变量p
p->data //p所指结点的数据域
p->next //p所指结点的指针域,即后继结点的存储地址
LinkList:指向LNode类型的指针变量,通常用于定义头指针的数据类型,如
LinkList head; //定义了一个头指针head
比如在p所指向的数据元素之后插入新结点,基本语句为:
LNode*s;//定义一个LNode类型的指针变量s
s=new LNode;//申请结点空间
s->data=x;
s->next=p->next;
p->next=s;//注意:两个语句的操作顺序不能交换。
3 树形结构中指针和结构体的使用
树形结构中数据元素之间是一对多的关系,以二叉树为例,一般采用链式存储结构,便于进行插入、删除运算。二叉树类型定义如下:
typedef struct node{
DataType data; //数据域
struct node *lchild,*rchild; //左右指针域
}BiTNode;
typedef BiTNode *BiTree; //指向二叉树结点的指针类型
如构造二叉树算法如下:
void CreateBiTree( BiTree*t) //构造二叉链表
{ char ch;
scanf("\n%c",&ch);
if(ch=='0') *t=NULL; //读入0时,将相应结点置空
else{*t=new BiTNode; //申请结点空间
(*t)->data=ch;
CreateBiTree(&(*t)->lchild); //构造二叉树的左子树
CreateBiTree(&(*t)->rchild); //构造二叉树的右子树
} }
4 图形结构中指针和结构体的使用
图形结构中数据元素之间是多对多的关系,一般采用邻接矩阵进行存储,存储顶点和边(或者弧)的信息。以邻接矩阵存储图的类型定义:
typedef struct{
int visited[MaxV]; //顶点表
int edges[MaxV][MaxV]; //边表
int vertexN,edgeN; //顶点数和边数
}Graph;
比如图的深度优先遍历算法如下:
void DFS (Graph*G,int v){
int w;
G->visited[v]=1;
for(w=0;wvertexN;w++){
if(G->edges[v][w] && !G->visited[w]) { DFS(G, w); }
} }
5 结束语
指针和结构体在数据结构中频繁使用,希望通过本文的讲解,帮助学生理解结构体定义数据类型的方法,掌握利用指针完成操作的方法,学好《数据结构》这门课程,为后续专业课奠定良好的基础。
参考文献:
[1]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2002.
[2]刘振鹏.数据结构(第六版)[M].北京:中国铁道出版社,2010.
[3]杨丽萍.数据结构中指针的应用及分析[J].计算机时代,2012(02).
[4]孔兵.数据结构实验中指针相关问题[J].教育教学论坛,2014(01).
作者简介:崔敏(1981.06-),女,山东济南人,助教,教师,本科,研究方向:计算机软件技术及应用。
作者单位:济南职业学院,济南 250100
摘 要:《数据结构》是计算机专业的专业基础课程,采用理论与实践相结合的教学模式,实践教学一般采用C语言作为算法的程序设计语言,在VC++环境下运行调试,其中指针和结构体的使用成为学生编写程序的难点,本文从指针和结构体的概念出发,讨论指针和结构体在数据结构实训中的应用。
关键词:数据结构;实践教学;指针;结构体;C语言
中图分类号:TP311.12
1 指针和结构体的概念
在程序中定义一个变量,如int x;在编译时系统就根据定义的变量类型,给这个变量分配相应的内存单元。内存中每个字节都有一个编号,称为“地址”,在地址所标识的内存单元中存放数据。在程序中,一般通过变量名对内存单元进行存取操作,称为“直接访问”,如x=7;printf(“%d”,x);假设定义一个变量p,用于存放整型变量x的地址,int*p=&x;则变量p称为“指针变量”,我们称指针p指向x。通过指针p访问x,称为“间接访问”,如*p。
因此定义指针变量的格式是:基类型 *指针变量名;
引用指针变量的格式是:*指针变量名。
结构体将不同类型的数据组合成一个有机的整体,定义一个新的数据类型,格式:typedef struct
{成员列表}结构体名;
结构体变量的引用格式:结构体变量名.成员名。
2 线性结构中指针和结构体的使用
线性结构中数据元素之间是1:1的线性关系,线性表是最基本的线性结构,有顺序存储结构和链式存储结构两种存储方法。顺序存储结构是在内存中用一段连续的存储单元来依次存储线性表的数据元素,用元素在机内的物理位置相邻表示逻辑相邻关系,常借助于数组来表示数据存储区域。因此顺序表类型定义如下:
#define MaxSize 100 // MaxSize是数组的容量,便于后期进行插入运算
typedef char DataType; //程序中的DataType设定为char型,便于统一修改
typedef struct{
DataType data[MaxSize];//data数组用于存放数据元素
int Last;//整型变量last存放当前顺序表中最后一个数据元素的下标值
}SeqList;//SeqList为顺序表的数据类型
SeqList*L;//定义一个指针变量L
L=new SeqList;//new用来申请顺序表的存储空间,L指向此顺序表
顺序表表长:L->Last+1
顺序表中的数据元素:L->data[0]~L->data[L->Last]
比如顺序表的插入运算Insert_SeqList(SeqList *L,int i,DataType x)基本语句如下:
for(j=L->last;j>=i-1;j--)
L->data[j+1]=L->data[j];//从最后一个元素到第i个元素逐一后移
L->data[i-1]=x; //在i位置处插入元素x
L->last++; //表长加1
链式存储结构是用一组任意的存储单元存放线性表的数据元素,逻辑次序和物理次序不一定相同,元素之间的逻辑关系用指针表示。单链表的类型定义如下:
typedef struct Node{
DataType data;//数据域,存储数据元素
struct Node * next;//指针域,存储后继结点的地址
}Lnode,*LinkList;
LNode*p;//定义一个LNode类型的指针变量p
p->data //p所指结点的数据域
p->next //p所指结点的指针域,即后继结点的存储地址
LinkList:指向LNode类型的指针变量,通常用于定义头指针的数据类型,如
LinkList head; //定义了一个头指针head
比如在p所指向的数据元素之后插入新结点,基本语句为:
LNode*s;//定义一个LNode类型的指针变量s
s=new LNode;//申请结点空间
s->data=x;
s->next=p->next;
p->next=s;//注意:两个语句的操作顺序不能交换。
3 树形结构中指针和结构体的使用
树形结构中数据元素之间是一对多的关系,以二叉树为例,一般采用链式存储结构,便于进行插入、删除运算。二叉树类型定义如下:
typedef struct node{
DataType data; //数据域
struct node *lchild,*rchild; //左右指针域
}BiTNode;
typedef BiTNode *BiTree; //指向二叉树结点的指针类型
如构造二叉树算法如下:
void CreateBiTree( BiTree*t) //构造二叉链表
{ char ch;
scanf("\n%c",&ch);
if(ch=='0') *t=NULL; //读入0时,将相应结点置空
else{*t=new BiTNode; //申请结点空间
(*t)->data=ch;
CreateBiTree(&(*t)->lchild); //构造二叉树的左子树
CreateBiTree(&(*t)->rchild); //构造二叉树的右子树
} }
4 图形结构中指针和结构体的使用
图形结构中数据元素之间是多对多的关系,一般采用邻接矩阵进行存储,存储顶点和边(或者弧)的信息。以邻接矩阵存储图的类型定义:
typedef struct{
int visited[MaxV]; //顶点表
int edges[MaxV][MaxV]; //边表
int vertexN,edgeN; //顶点数和边数
}Graph;
比如图的深度优先遍历算法如下:
void DFS (Graph*G,int v){
int w;
G->visited[v]=1;
for(w=0;wvertexN;w++){
if(G->edges[v][w] && !G->visited[w]) { DFS(G, w); }
} }
5 结束语
指针和结构体在数据结构中频繁使用,希望通过本文的讲解,帮助学生理解结构体定义数据类型的方法,掌握利用指针完成操作的方法,学好《数据结构》这门课程,为后续专业课奠定良好的基础。
参考文献:
[1]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2002.
[2]刘振鹏.数据结构(第六版)[M].北京:中国铁道出版社,2010.
[3]杨丽萍.数据结构中指针的应用及分析[J].计算机时代,2012(02).
[4]孔兵.数据结构实验中指针相关问题[J].教育教学论坛,2014(01).
作者简介:崔敏(1981.06-),女,山东济南人,助教,教师,本科,研究方向:计算机软件技术及应用。
作者单位:济南职业学院,济南 250100