不带头结点的单向链表的基本操作概论

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LINK p,s; int k; p=L; k=1; while(k<i-1 && p!=NULL){k++; p=p->next;} if(k>i-1 || p==NULL)
{ printf(“位置非法,不能插入\n”); return 0; }
s=new NODE; s->data=x; if(i==1) //插入的是第一个结点 { s->next=L; L=s; return 1; } //插入的不是第一个结点
操作前:L
1 Li 18
2 He 20 ^
步骤3: 删除p指向结点的下一个结点q,回收q指向的结
点空间 L
p K=1
q①
Li 18 ^ He 20 ^

q= p->next; //① p->next =q->next; //② delete q;
删除函数 int deleteLink(LINK &L, int i)
操作前: L
1 Li 18
2 He 20 ^
步骤1: 用工作指针p记住第i-1个结点的地址
用k记p指向的结点序号
L
p K=1
Li 18
He 20 ^
p=L; k=1; while(p!=NULL && k<i-1){k++; p=p->next;}
插入操作
例:在i=2位置上插入学生数据x(liu,19)
2 He 20 ^
删除操作
例:删除在i=1的位置上的学生
操作前:L
1 Li 18
2 He 20 ^
步骤1: 用q记住第1个结点的地址,再删除q指向的 结点,并释放空间
L
q1
2
Li 18
He 20 ^
q=L; L=q->next; delete q;
删除操作
例:删除在i=2的位置上的学生
操作前:L
初始化操作
功能:创建一个空链表 初始条件:已知头指针变量(没有确定的值) 操作结果:头指针变量为空,发生了改变 操作前: L ? 操作后: L ^
初始化函数
操作前: L ? 操作后: L ^
int initLink(LINK &L) {
L=NULL; return 1; }
插入操作
• 功能:在指定位置插入一个新的结点
操作前: L
1 Li 18
2 He 20 ^
步骤3: 生成新结点,将数据放入结点,插入到链表中。
L
p K=1
Li 18


s liu 19
He 20 ^
s=new NODE; s->data=x; s->next=L;
L=s;
插入函数
int insertLink(LINK &L, int i, STU x) {
s->next=p->next; p->next=s; return 1; }
删除操作
• 功能:将指定位置上的结点删除 ➢ 已知条件:
链表的头指针,删除的位置 ➢ 操作的结果:
链表上少了一个结点,链表的头指针可能改变。
删除操作
例:删除位置为i=1的结点
操作前:L
1 Li 18
操作后:L
1 He 20 ^
操作前: L
1 Li 18
2 He 20 ^
步骤3: 生成新结点,将数据放入结点,插入到链表中。
L
p K=1
Li 18
He 20 ^ s=new NODE;


s->data=x;
s liu 19
s->next=p->next;
p->next=s;
插入操作
例:在i=1位置上插入学生数据x(liu,19)
}
删除函数
//删除的不是第1个结点 { q= p->next; p->next =q->next; delete q; return 1; }
不带头结点的单向链表的基本操作
不带头结点的单向链表的基本操作
初始化
插入 一个基本操作对应一个函数
删除 遍历 假定链表上存放的是学生的数据(姓名,年龄)
L
Wu 20
Li 18
He 20 ^
链表操作所需自定义的数据类型
学生数据(姓名,年龄)
typedef struct
{
char name[20]; //存放姓名
操作前: L
1 Li 18
2 He 20 ^
步骤2: 判断能否进行插入。如果i<1,会出现k>i-1,不 能插入;如果i>3,会出现p为空,不能插入。
L
p K=1
Li 18
He 20 ^
if(k>i-1 || p==NULL) printf(“位置非法,不能插入\0”);
插入操作
例:在i=2位置上插入学生数据x(liu,19)
{ LINK p,q; int k; p=L; k=1; while(p->next!=NULL && k<i-1) { k++; p=p->next; } if(k>i-1 || p->next==NULL) { printf(“位置非法或链表为空,不能删除\0”); return 0; } if(i==1) //删除第1个结点 { q=L; L=q->next; delete q; return 1; } {……}//删除的不是第1个结点代码在下一页
1 Li 18
2 He 20 ^
步骤2:判断能否进行删除。如果i<1,会出现k>i-1,不能 删除;如果i>=3会出现 p->next为空,不能删除
L
p K=1
Li 18
He 20 ^
if( k>i-1 || p->next==NULL) printf(“位置非法,不能删除\0”);
删除操作
例:删除i=2位置的学生
1 Li 18
2 He 20 ^
步骤1: 用工作指针p记住第i-1个结点的地址
用k记p指向的结点序号
L
p K=1
Li 18
He 20 ^
p=L; k=1; while( p->next!=NULL && k<i-1)
{ k++; p=p->next; }
删除操作
例:删除i=2位பைடு நூலகம்上的结点
操作前:L
int age;
//存放年龄
}STU;
注意:上面省略了结构体名
链表操作所需自定义的数据类型
结点类型(学生数据类型,指针类型)
指向结点的指针类型
typedef struct node
{
STU data;
//存放学生数据
struct node *next; //存放下一个结点地址
}NODE, *LINK;
➢ 已知条件: 链表的头指针,插入的位置,插入的数据
➢ 操作的结果: 链表上多了一个结点,链表的头指针可能改变。
插入操作
例:在i=2的位置上插入学生数据x(liu,19)
操作前: L
1 Li 18
2 He 20 ^
操作后: L
1 Li 18
2 He 20 ^
liu 19
插入操作
例:在i=2的位置上插入学生数据x(liu,19)
相关文档
最新文档