带头结点的单向链表的基本操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p=L; k=0;
while(p->next!=NULL && k<i-1) 用引用变量x
{k++; p=p->next;} 带出被删除学
if(p->next==NULL || k>i-1)
p=L; k=0;
while(k<i-1 && p!=NULL){k++; p=p->next;}
if(k>i-1 || p==NULL) { printf(“位置非法,不能插入\n”);
Βιβλιοθήκη Baidu
return 0;
}
s=new NODE; s->data=x;
s->next=p->next; p->next=s;
插入;如果i>3,会出现p为空,不能插入。
L
p K=0 p K=1
Li 18
He 20 ^
if(p==NULL || k>i-1)
printf(“位置非法,不能插入\n”);
第9页/共22页
插入操作
例:在i=2位置上插入学生数据x(liu,19)
操作前:L
0
1 Li 18
2 He 20 ^
步骤3:生成新结点,将数据放入结点,插入到链表中。
带头结点的单向链表的基本操作
初始化
插入 一个基本操作对应一个函数
删除 遍历 假定链表上存放的是学生的数据(姓名,年龄)
L
Li 18
He 20 ^
第1页/共22页
链表操作所需自定义的数据类型
学生数据(姓名,年龄)
typedef struct
{
char name[20]; //存放姓名
int age;
操作前:L
1 Li 18
2 He 20 ^
操作后:L
1 Li 18
2 He 20 ^
liu 19
第7页/共22页
插入操作
例:在i=2的位置上插入学生数据x(liu,19)
操作前:L
0
1 Li 18
2 He 20 ^
步骤1: 用工作指针p记住第i-1个结点的地址 用k记p指向的结点序号
L
p K=0 p K=1
第15页/共22页
删除操作
例:删除i=1位置的学生
操作前:L
0
1 Li 18
2 He 20 ^
步骤3:删 点除 空p间L指向结p点的K=下0 一个结q 点①q,回收q指向的结
Li 18
He 20 ^
②
q= p->next; //①
p->next =q->next; //②
delete q;
第16页/共22页
删除函数(1)
int deleteLink(LINK L, int i)
{ LINK p,q; int k; if(L->next==NULL)return 0;
p=L; k=0;
while(p->next!=NULL && k<i-1)
{k++; p=p->next;}
if(p->next==NULL || k>i-1)
return 1; }
第11页/共22页
删除操作
功能:将指定位置上的结点删除 已知条件: 链表的头指针,删除的位置 操作的结果: 链表上少了一个结点,链表的头指针没有 改变。
第12页/共22页
删除操作
例:删除位置为i=1的结点
操作前:L
1 Li 18
操作后:L
1 He 20 ^
2 He 20 ^
if(L==NULL)return 0; L->next=NULL; return 1; }
第5页/共22页
插入操作
功能:在指定位置插入一个新的结点
已知条件: 链表的头指针,插入的位置,插入的数据 操作的结果: 链表上多了一个结点,链表的头指针没有改 变。
第6页/共22页
插入操作
例:在i=2的位置上插入学生数据x(liu,19)
Li 18
He 20 ^
p=L; k=0;
while(p!=NULL && k<i-1){k++; p=p->next;}
第8页/共22页
插入操作
例:在i=2位置上插入学生数据x(liu,19)
操作前:L
0
1 Li 18
2 He 20 ^
步骤2:判断能否进行插入。如果i<1,会出现k>i-1,不能
第13页/共22页
删除操作
例:删除在i=1的位置上的学生
操作前:L
0
1 Li 18
2 He 20 ^
步骤1: 用工作指针p记住第i-1个结点的地址
用k记p指向的结点序号
L
p K=0
Li 18
He 20 ^
p=L; k=0; while(p->next!=NULL && k<i-1 )
{ k++; p=p->next; } 第14页/共22页
{ printf(“位置非法,不能删除\n”);
return 0; } q= p->next; p->next =q->next; delete q;
return 1;
}
第17页/共22页
删除函数(2)
int deleteLink(LINK L, int i, STU &x)
{ LINK p,q; int k; if(L->next==NULL)return 0;
第3页/共22页
初始化操作
功能:创建一个空链表(只有一个头结点) 已知条件:已知头指针变量(没有确定的值) 操作结果:头指针变量存放头结点的地址,头指针变
量发生了改变
操作前: L ? 操作后: L
^
第4页/共22页
初始化函数
操作前: L ? 操作后: L
int initLink(LINK &L) { ^ L=new NODE;
L
p K=0 p K=1
Li 18
He 20 ^
②
①
s=new NODE; s->data=x;
s liu 19
s->next=p->next;//①
p->next=s;//②
第10页/共22页
插入函数
int insertLink(LINK L, int i, STU x)
{ LINK p,s; int k;
删除操作
例:删除i=1位置上的结点
操作前:L
0
1 Li 18
2 He 20 ^
步骤2: 判断能否进行删除。如果i<1,会出现k>i-1,不能
删除;如果i>=3,会出现p->next为空,不能删除
L
p K=0
Li 18
He 20 ^
if(p->next==NULL || k>i-1)
printf(“位置非法,不能删除\0”);
//存放年龄
}STU;
注意:上面省略了结构体名
第2页/共22页
链表操作所需自定义的数据类型
结点类型(学生数据类型,指针类型)
指向结点的指针类型
typedef struct node
{
STU data;
//存放学生数据
struct node *next; //存放下一个结点地址
}NODE, *LINK;