本章的代码大多数都是伪代码,是不能直接运行的
删除递增单链表中,data值为mink~maxk之间的值
思想:先找到第一个大于等于mink的结点q,并记录其前驱结点pre,再找到第一个大于等于maxk的结点p,然后依次删除从q到p的结点
void f(LinkList &L,int mink,int maxk){
p = L->next;
while(p&&p->data<mink){ //找到第一个大于等于mink的结点
pre = p;
p = p->next;
}//while
if(p){
while(p&&p->data<maxk) //找到第一个大于等于maxk的结点
p = p->next;
q = pre->next;
pre->next = p;
while(q!=p){
s = q->next;
delete q;
q = s;
}
}//if
}//f
递归删除不带头结点的单链表中值为X的结点
void f(LinkList &L,ElemType X){
if(L==null)
return;
if(L->data == X){
p = L;
L = L->next;
delete p;
f(L,x);
}
else
f(L->next,X);
}
反向输出带头结点的单链表L每个结点的值
//用栈
void f(LinkList L){
int num;
InitStack(s);
p = L->next;
whilie(p != null){
push(s,p->data);
p = p->next;
}
while(IsEmpty(s)){
num = Pop(s);
printf("num",%d);
}
}
//用递归
void f(LinkList& L){
if(L->next != null)
f(L->xext);
printf(L->data);
}
单链表递增排序
思想:先生成只有一个数据节点的单链表,然后依次扫描剩下的结点,直到结点尾端,在表中通过比较确定插入点的前端结点
void f(LinkList &L){
p = L->next;
r = p->next;
p->next = null;
p = r;
while(p!=null){
r = p->next;
pre = L;
while(pre->next!=null&&pre->next->data<p->data)
pre = pre->next;
p->next = pre->next;
pre->next = p->next;
p = r;
}
}
删除单链表L中值为X的结点
//前结点法
void f(LinkList& L){
p = L->next;
pre = L;
while(p!=null){
if(p->data==X){
pre->next = p->next;
delete p;
p = pre->next;
}
else{
pre = p;
p = p->next;
}
}
}
//尾插法,插入值不为x的结点
void f(LinkList& L){
p = L->next;
r = L;
while(!p){
if(p->data==x){
q = p;
p = p->next;
delete q;
}
r->next = p;
r = p;
p = p->next;
}
r->next = null;
}
删除单链表中数值最小的结点
void f(LinkList& L){
p = L->next;
pre = L;
min = p;
minpre = pre;
while(!p){ //找到比之前的最小结点还小的结点
if(p->data < min->data){
min = p;
minpre = pre;
}
pre = p; //继续寻找
p = p->next;
}
minpre->next = min->pre; //删除最小结点
delete min;
}
逆置链表
有空写上