1
0
mirror of https://github.com/142vip/408CSFamily.git synced 2026-02-03 02:23:38 +08:00
Files
408CSFamily/code/ds/LinkList.cpp
喜欢芝士的妹妹 6d81d1706a feat: 修改代码
2023-08-30 22:12:32 +08:00

117 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 单链表头插法
LinkList CreateListWithStartNode(LinkList &L){
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode)); // 创建头结点L
L->next=NULL; // 初始化空链表
// 控制台输入值
scanf("%d",&x);
// 输入9999 表示结束
while(x!==9999){
// 开辟新结点存储空间
s=(LNode*)malloc(sizeof(LNode));
// 结点数据域赋值
s->data=x;
// 修改指针新结点插入表中【注意L->next为头结点的指针域】
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
// 返回单链表
return L;
}
// 单链表尾插法
LinkList CreateListWithEndNode(LinkList &L){
int x; // 输入结点值
L=(LinkList)malloc(sizeof(LNode));
LNode *s; // 新结点s
LNode *r=L; // r为尾指针
// 控制台输入值
scanf("%d",&x);
while(x!==9999){
// 开辟新结点存储空间
s=(LNode *)malloc(sizeof(LNode));
// 新结点s的数据域赋值为x
s->data=x;
// 单链表L的尾指针指向新的结点s
r->next=s;
// 指针r指向新的表尾结点
r=s;
scanf("%d",&x);
}
// 表尾指针置空【重要】
r->next=NULL;
// 返回单链表
return L;
}
// 单链表按序号查找
LNode *GetElem(LinkList L,int i){
int j=1; // 查询计数初始为1
LNode *p=L->next; // 单链表头结点指针赋值给指针p
// 第0个元素则指向头结点返回头结点
if(i==0){
// 头结点包含数据域和指针域
return L;
}
// 不等于0却小于1则i为负数无效直接返回NULL查询结果空
if(i<1){
return NULL;
}
// p存在且计数没有走到初始i的位置
while(p&&j<i){
// 指针后移
p=p->next;
// 计数标记+1
j++;
}
// 注意: 当p不存在时 跳出循环p=NULL; 当p存在但是j大于等于i跳出循环返回查找的结果返回p
// 从跳出循环上来分析p要么存在即找到的结点元素要么为空即NULL
// 跳出循环返回第i个结点的指针
return p;
}
//单链表按值查找
LNode *LocateElem(LinkList L,ElemType e){
// 指针【哨兵】
LNode *p=L->next;
// 从第1个结点开始查找数据域(data)为e的结点
while(p!=NULL&&p->data!=e){
// 无法匹配,指针后移
p=p->next;
}
// 注意p为NULL的时候说明单链表已经遍历的尾结点了跳出循环没有找到目标结点
// 查找到第1个匹配的结点跳出循环返回结点指针
return p;
//
}