折半查找:
int Binary_Search(int a[],int key){
int low=0,high = a.length-1,mid;
while(low<=high){
mid = (low + high) / 2;
if(a[mid] == key){
return mid;
}
else if(a[mid]>key){
high = mid - 1;
}
else{
low = high + 1;
}
}
return 0;
}
单链表的定义:
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode, *LinkList;
单链表双指针处理:
//双指针法,通过一次遍历找到中间结点
LNode *findMidNode (LinkList head){
LNode *p=head; //p指针,每次往后走一步
LNode *q=head; //q指针,每次往后走两步,当q指向最后一个结点时,p刚好指向中间那个结点
while(q->next!=NULL){
q=q->next; //q往后走一步
if (q->next!=NULL){
q=q->next; //q再往后走一步
p=p->next; //p往后走一步
}
if(p==head)
printf ("一个空链表,让我找中间结点?你一定是在逗我~");
else
printf("中间结点的值为:%d\n", p->data);
return p; //返回p所指向的结点
}
//双指针法,通过一次遍历找到倒数第k的结点
LNode *findDaoShuKNode(LinkList head, int k){
LNode *p=head; //p指针,等q指针走到第k个结点时,p指针再出发
LNode *q=head; //q指针,每次往后走一步
int count=0;
bool chong = false; //p指针要不要冲?
while(q->next!=NULL){
q=q->next; //q往后走一步
count++; //计数+1
if (count==k)
chong = true; // q走到第k个结点时,p指针开冲
if(chong)
p-p->next;
}
if(p==head)
printf("这个链表长度小于%d,并不存在倒数第k个结点\n",k);
else
printf("倒数第%d个结点的值为: %d\n",k, p->data) ;
return p; //返回p所指向的结点
}
单链表原地逆置:
LinkList Reverse(LinkList L){ //L是带头结点的单链表,本算法将L就地逆置
LNode *p, *r; //p为工作指针,r为p的后继
P=L->next; //从第一个元素结点开始
L->next=NULL; //先将头结点L的next域置为null
while(p!=NULL){ //依次将元素结点摘下
r=p->next; //暂存p的后继
p->=next=L->next; //将p结点插入到头结点之后
L->next=p;
p=r;
}
return L;
}