不带头结点的单向链表的基本操作
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作的结果:
链表上多了一个结点,链表的头指针可能改变。
插入操作
例:在i=2的位置上插入学生数据x(liu,19) 操作前: 操作后: L L 1 Li 18 2 He 20 ^ 2 He 20 ^ liu 19
1 Li 18
插入操作
例:在i=2的位置上插入学生数据x(liu,19) 2 1 L 操作前: Li 18 He 20 ^ 步骤1: 用工作指针p记住第i-1个结点的地址 用k记p指向的结点序号 p K=1 L Li 18 He 20 ^
删除操作
• 功能:将指定位置上的结点删除 已知条件: 链表的头指针,删除的位置 操作的结果:
链表上少了一个结点,链表的头指针可能改变。
删除操作
例:删除位置为i=1的结点 操作前:L 操作后: L 1 Li 18
2 He 20 ^
1 He 20 ^
删除操作
例:删除在i=1的位置上的学生 2 1 L 操作前: Li 18 He 20 ^ 步骤1: 用q记住第1个结点的地址,再删除q指向的 结点,并释放空间
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个结点代码在下一页 }
if(k>i-1 || p==NULL) printf(“位置非法,不能插入\0”);
插入操作
例:在i=2位置上插入学生数据x(liu,19) 2 1 L 操作前: Li 18 He 20 ^ 步骤3: 生成新结点,将数据放入结点,插入到链表中。
L p K=1 Li 18 He 20 ^ s=new NODE; s->data=x; s->next=p->next; p->next=s;
p=L; k=1; while( p->next!=NULL && k<i-1) { k++; Leabharlann Baidu=p->next; }
删除操作
例:删除i=2位置上的结点 1 L 操作前: Li 18
2 He 20 ^
步骤2:判断能否进行删除。如果i<1,会出现k>i-1,不能 删除;如果i>=3会出现 p->next为空,不能删除 L p K=1 Li 18 He 20 ^
② ① s liu 19
插入函数
int insertLink(LINK &L, int i, STU x) { 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; } //插入的不是第一个结点 s->next=p->next; p->next=s; return 1; }
② ① s liu 19
插入操作
例:在i=1位置上插入学生数据x(liu,19) 2 1 L 操作前: Li 18 He 20 ^ 步骤3: 生成新结点,将数据放入结点,插入到链表中。
L p K=1 Li 18 He 20 ^ s=new NODE; s->data=x; s->next=L; L=s;
p=L; k=1; while(p!=NULL && k<i-1){k++; p=p->next;}
插入操作
例:在i=2位置上插入学生数据x(liu,19) 2 1 L 操作前: Li 18 He 20 ^ 步骤2: 判断能否进行插入。如果i<1,会出现k>i-1,不 能插入;如果i>3,会出现p为空,不能插入。 p K=1 L Li 18 He 20 ^
创建链表函数
void creatLink(LINK &L) { STD x; int yn, n=1; initLink(L); //调用初始化函数,创建一个空链表 do { printf(“请输入学生的姓名和年龄,用空格隔开:”); scanf(“%s%d”,x.name, &x.age); insertLink(L,n,x); //调用插入函数 n++; printf(“继续吗?Yes=1, No=0: ”); scanf(“%d”,&yn); if(yn==0)break; }while(1); }
删除函数
//删除的不是第1个结点
{
q= p->next;
p->next =q->next;
delete q;
return 1;
}
遍历操作
例:依序显示各个结点上的学生数据 L Li 18 p He 20 ^ p p
让工作指针p从第一个结点开始,直至为空。
遍历函数
void dispLink(LINK L)
链表操作所需自定义的数据类型
结点类型(学生数据类型,指针类型)
指向结点的指针类型
typedef struct node
{
STU data; }NODE, *LINK;
//存放学生数据
struct node *next; //存放下一个结点地址
初始化操作
功能:创建一个空链表
初始条件:已知头指针变量(没有确定的值)
q= p->next; //① p->next =q->next; //② delete q;
int deleteLink(LINK &L, int i) { LINK p,q; int k; p=L; k=1; while(p->next!=NULL && k<i-1)
删除函数
{ k++; p=p->next; }
{
LINK p=L;
if(p==NULL)printf(“没有数据!\n”);
while(p!=NULL) { printf(“%10s%5d\n”,p->data.name,p->data.age); p=p->next; } }
创建链表
(1)用初始化操作创建一个空链表 (2)用插入操作,实现一个新结点的插入 (3)用循环反复调用(2),直至结束
不带头结点的单向链表的基本操作
不带头结点的单向链表的基本操作
初始化
插入
删除
一个基本操作对应一个函数
遍历 假定链表上存放的是学生的数据(姓名,年龄)
L Wu 20 Li 18 He 20 ^
链表操作所需自定义的数据类型
学生数据(姓名,年龄)
typedef struct
{
char name[20]; //存放姓名 int age; }STU; 注意:上面省略了结构体名 //存放年龄
操作结果:头指针变量为空,发生了改变 操作前: 操作后: L ? L ^
初始化函数
int initLink(LINK &L)
操作前: 操作后:
L ? L ^
{ L=NULL; return 1; }
插入操作
• 功能:在指定位置插入一个新的结点 已知条件: 链表的头指针,插入的位置,插入的数据
if( k>i-1 || p->next==NULL) printf(“位置非法,不能删除\0”);
删除操作
例:删除i=2位置的学生 1 L 操作前: Li 18
2 He 20 ^
步骤3: 删除p指向结点的下一个结点q,回收q指向的结 点空间 p K=1 q① L Li 18 ^ He 20 ^ ②
L q=L; q 1 Li 18 L=q->next; 2 He 20 ^ delete q;
删除操作
例:删除在i=2的位置上的学生 2 1 L 操作前: Li 18 He 20 ^ 步骤1: 用工作指针p记住第i-1个结点的地址 用k记p指向的结点序号 p K=1 L Li 18 He 20 ^