链表的基本操作

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

链表基础

创建单向链表

创建步骤:

(1)创建单向链表⏹定义结点的结构类型,说明表头指针⏹按照结构的大小分配一块内存区域首地址赋给

个头指针⏹将该区域的首地址赋给一个头指针⏹继续分配一块内存区域

将该区域的首地址分配给前一个结点的指针变量⏹将该区域的首地址分配给前个结点的指针变量⏹继续上述过程,直到

链表的尾。

链表基础

(2) 两个重要的库函数

动态存储分配函数(头文件:stdlib.h)

原型:void * malloc(int size)

功能:动态分配长度为size个字节的存储区。

功能动态分配长度为个字节的存储区

返回值:分配成功,返回所分配区域的首地址。

分配失败,返回0 。

分配失败返回0

注意:一般系统返回指向void型数据的指针,而应用时需要指向结构类型的指针,所以要用强制类型转换。

例如t t t d t*

例如:struct student * ps;

ps=(struct student *)malloc(sizeof(struct student));

链表基础

释放内存函数

原型:void free(void *p)

头文件:stdlib.h

头文件:stdlib h

功能:释放p所指向的内存空间

返回值:无

例如:free(ps);

ps是最近一次调用malloc函数时返回的值

链表基础

(3) 创建链表的过程

定义结点的结构,说明表头指针

例如:定义描述学生(姓名/住址/电话)的结点

d

struct node

{ char name[20],address[20],phone[15];

struct node * link; /*定义node型结构指针*/ }; /* 定义结构*/

typedef struct node NODE/* 定义结点类型*/ NODE*head;/*说明头指针head NODE * head ;/* 说明头指针head*/

链表基础

申请存储空间建立表头节点

将malloc的返回值强NODE * p;

p= ( NODE * ) malloc( sizeof (NODE) ) ;

/*开辟新存储区,申请表头节点*/

制转换为NODE型

/ 开辟新存储区,申请表头节点/ p->link = NULL;/* 将表头节点的link置为NULL*/ head = p;/* head指向表头节点p*/

head

p

P指向最后一个结点

NULL

表头节点

表头指针

(不含数据节点的空链表)

链表基础

加入第一个数据结点

NODE * p;

p

p= ( NODE * ) malloc( sizeof(NODE) ) ;

/* 申请新数据结点*/ gets(p>name);gets(p>address);gets(p>phone );

gets(p->name );gets(p->address);gets(p->phone );

/* 用访问结构的方法将数据读入p所指向的结点成员*/ p->link = NULL; /*将NULL存入p的link中*/

head->link = p; /* 将数据结点p 插在表头结点之后*/

p

head

NULL

name

NULL

表头指针表头节点数据节点

链表基础

从表头开始将数据节点插入链表中(插下一个数据节点)=(NODE *)malloc (sizeof (NODE));/*

p = ( NODE * ) malloc ( sizeof (NODE) ) ;/* 申请数据节点*/gets(p->name); gets(p->address);gets(p->phone );

/* 按照访问结构的方法,将数据存入p 所指向的节点*/li k h d li k p->link = head->link;

/* 将表头节点的link 存入p 的link 中*/

head->link = p;

/* 将数据结点p 插在表头结点之后*/p;p p

name2

head

数据节点

表头指针

表头节点

数据节点

name1NULL

x

链表基础

3、访问链表中全部数据节点

output ( NODE

* head )p (){ NODE * p;

p = head->link;/* p 指向第一个数据节点*/while (p!=NULL )while ( p!NULL ){puts ( p->name ) ; /* 输出p 所指向节点的数据*/

p = p->link ;/* p 指向下一个数据节点*/

head }

}

需要分析两种情况:

NULL

表头指针

表头节点head

表头指针表头节点数据节点

name1NULL

链表基础

4、在链表中插入新节点(基本原理)

q 个节点指针p

定位——指针q 指向第i 个节点,指针p 指向需要插入的节点

◆——p->link = q->link ;链接后面指针p q ;

链接前面指针——q->link = p ;

q

x

head

D3

D2D1D0^表头节点

数据节点

数据节点

数据节点

数据节点

p

相关文档
最新文档