先看例子,例1:定义链表
//定义链表 struct stu
{
int name;
int age;
struct stu *next;
};
用一组地址任意的存储单元存放线性表中的数据元素。:以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素 或 数据元素的映象)
不得不说百度解释的太官方了。
1.含义:多组不同类型的数的组合(数组存储是不连续的)
2.组成: 表头+结点+表尾
结点=数据域+指针域
表头:只有指针域 表尾:只有数据域
以前老师讲的还是不错的,影响深刻,不过好像还是有点云里雾里。
LZ所理解的链表
1.链表就是一系列结构体
2.这个结构体有一个特别的指针,类型为该结构体类型*。
结合例1来看很清晰,但前提是你一定要会结构体。
正是如此,所以学链表之前一定先会结构体,而学会结构体之前一定要会用指针,又是指针。看似困难其实一点不难,一切复杂类型都是由基本类型构成的,链表也是如此,只不过起了一个时尚的名字。
例2:建立链表函数
//建立链表函数 struct stu * creat(int n) { struct stu *head,*pf,*pb; int i,aa,bb; for(i=0;i<n;i++) { pb=(struct stu *)malloc(sizeof(struct stu)); printf("请输入第%d个人的编号和年龄:",i+1,i+1); scanf("%d %d",&aa,&bb); pb->name=aa; pb->age=bb; if(i==0) pf=head=pb; else pf->next=pb; pf=pb; } pb->next=0; return(head); }
例2用到了指针函数,结构体指针,指针学好了理解起来应该不难。
从建立链表函数可以看出,
pb=(struct stu *)malloc(sizeof(struct stu));
这句为动态分配内存空间(上一篇文章简要介绍了它)。每新增一个结点,就分配一个sizeof(struct stu)大小的空间,按需分配,理想共产主义有木有。
附上完整的例子,例3:
#include <stdio.h> #include <stdlib.h> //定义链表 struct stu { int name; int age; struct stu *next; }; //建立链表函数 struct stu * creat(int n) { struct stu *head,*pf,*pb; int i,aa,bb; for(i=0;i<n;i++) { pb=(struct stu *)malloc(sizeof(struct stu)); printf("请输入第%d个人的编号和年龄:",i+1,i+1); scanf("%d %d",&aa,&bb); pb->name=aa; pb->age=bb; if(i==0) pf=head=pb; else pf->next=pb; pf=pb; } pb->next=0; return(head); } //打印函数 void print(int n,struct stu *a) { int i; for(i=0;i<n;i++) { printf("Name=%d Age=%d ",*a,a->age); a=a->next; } } //主函数 int main() { int n; struct stu *a; printf("请输入链表的长度:"); scanf("%d",&n); a=creat(n); print(n,a); system("pause"); return 0; }
例3包括了链表的定义,构造链表的方法,链表的调用方法等。光会写出例3一点用也没有,一定要弄清楚怎么定义构造,怎么赋值,怎么使用,怎么得到具体某一个结点,结点元素的赋值,遍历方法,如何通过指针去访问。