L->next = s ;//将新结点插入表中,
L 为头指针
scanf("%d" , &x) ;//读入下一个结点
值
}
return L;
}
7.尾插法建立单链表
LinkList CreatLinkList(LinkList &L){
int x ;
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;
}
8.链式存储按序号查找结点
LNode * GetElem(LInkList L , int i){
int j = 1;//计数,初始为 1
LNode *p = L->next ;//第一个结点指针
赋给 p
if(i==0) return L ;//若 i 等于 0,则返回
头结点
if(i<1) return NULL; //若 i 无效,则返回
NULL
while (p && j<i){ //从第 1 个结点开始
找,查找第 i 个结点
p=p->next ;
j++;
}
return p; //返回第 i 个结点的指针,如
果 i 大于表长,直接返回 p 即可
}
9.链式存储按值查找结点
LNode * LocateElem(LinkList L, ElemType e){
LNode *p = L->next;
while(p!=NULL && p->data!=e){//从第
1 个结点开始查找 data 域为 e 的结点
p = p->next ;
}
return p;//找到后返回该结点指针,否
则返回 NULL
}
10.链式存储插入结点
算法思路: 1.取指向插入位置的前驱结点
的指针 ① p=GetElem(L,i-1);
2.令新结点*s 的指针域指
向*p 的后继结点 ② s->next=p->next;
3.令结点*p 的指针域指
向新插入的结点*s ③ p->next=s;
bool LinkListInsert(LInkList &L , int
i ,ElemType e){
if( i<1 || i>=L.length) return false ;
int j = 1;
LNode *p = L->next , *s;
s = (LNode*)malloc(sizeof(LNode));
while (p && j<i-1)
{
p=p->next ;
j++;
}
s->next = p->next;
p->next = s ;
return true ;
}
11.链式存储删除结点
算法思路: 1.取指向删除位置的前驱结点
的指针 p=GetElem(L,i-1);
2.取指向删除位置的指针
q=p->next;
3.p 指向结点的后继指向被删除结
点的后继 p->next=q->next
4.释放删除结点
free(q);
bool LinkListDelete(LInkList &L , int
i ,ElemType &e){
if( i<1 || i>=L.length) return false ;
int j = 1;
LNode *p = L->next ,*q ;