个人主页:我的主页
小白一枚,欢迎指教👏
一、按位查找: GetElem(L,i)
- 获取表L中的第i个位置的元素的值
- 思想:从单链表中第一个结点出发,顺着指着next逐渐往下搜索,知道找到第i个结点为止,否则返回NULL。
//按位查找,返回第i个元素(带头结点)
LNode* GetElem(LinkList L, int i){
if(i<0)
return NULL;
LNode *p; //指针p指向当前扫描到的结点
int j=0; //L指向头结点,头结点是第0个结点,没有数据
p=L;
while(p!NULL && j<i) {
p=p->next;
j++''
}
return p;
}
二、按值查找 LoocateElem(L,e):
- 按值查找,找到数据域==e的结点
- 思想:从单链表第一个结点开始,依次往后比较表中各结点数据域的值,若某结点数据域的值=e,则返回该结点的指针,若没有这样的结点,则返回NULL。
LNode*LocateElem(LinkList L,ElemType e){
LNode *p=L->next; //从第1个结点开始查找数据域为e的结点
while(p!=NULL&&p->data!=e)
p=p->next;
return p; //找到后返回该结点指针,否则返回NULL
}
三、求表长操作Length(L):
- 思想:计算单链表中数据结点(不含头结点个数)的个数,从第一个结点开始,顺序依次访问表中的每个结点,要设置一个计数器变量,每访问一个结点计数器就加一,知道访问的空结点为止。
int Length(LinkList L){
int len =0; //统计表长
LNode *p=L;
while (p->next !=NULL){
p=p->next;
len++;
}
return len;
}
四、单链表的建立:尾插法/头插法
-
Q:如果给你很多个数据元素(ElemType),要把它们存到一个单链表里边,怎么办呢?
step:先初始化一个单链表,每次取一个元素,插入到表尾/表头 (带头结点的情况)
// 尾插法建立单链表
LinkList List_Taillnesert(LinkList &L){ //正向建立单链表
int x; //设ElemType为整型
L=(LinkList)malloc(sizeof(LNode)); //建立头结点
LNode *s,*r=L; //r为尾指针
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s; //r指向心的表尾结点
scanf("%d",&x);
}
r->next=NULL; //尾结点指针置空
return L; //返回头指针
}
- 头插法建立单链表
LinkList List_HeadInsert(LinkList &L){ //逆向建立单链表
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始为空链表
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode*)malloc(sizeof(LNode)); //创建新结点
s->data=x;
s->next=L->next;
L->next=s; //将新结点插入表中,L为头指针
scanf("%d",&x);
}
return L;
}
- (注意重要的应用:单链表的逆置)按照头插法,那么数据的位置应该是这样的情况:
- TIPS:如果要求逆置一个单链表,只需要设置一个指针,按顺序扫描数据,将扫描的数据再用头插法插入即可。