数据结构--链式队列、查找

目录

 

 

队列

查找


 

队列

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表。头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点。

队列的链式存储类型可描述为

typedef struct {//链式队列结点
    ElemType data;
    struct LinkNode *next;
}LinkNode;

typedef struct {
    LinkNode *front, *rear;//队列的队头和队尾指针
}LinkQueue;

当Q.front和Q.rear都为空时,链式队列为空。

出队时,首先判断对是否为空,若不空,则取出对头元素,将其从链表中摘除,并让Q.front指向下一个结点,若该节点是最后一个结点,则置Q.front和Q.rear都为null。入队时,建立一个新结点,将新结点插入到链表的尾部,并使Q.rear指向这个新插入的结点,若原队列为空,则令Q.front也指向该结点。(不带头结点的情况)

void InitQ(LinkQueue &Q){//初始化
    Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立头结点
    Q.front->next=NULL;
}
bool isempty(LinkQueue Q){//判断队列是否空
    if(Q.front==Q.rear) return true;
    else return false;
}
void EnQueue(LinkQueue &Q,ElemType x){

    LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
    s->data=x;
    s->next=null;
    Q.rear->next=s;
    Q.rear = s;
}

双端队列是一种限定插入和删除操作可以在队的两端进行的队列,


查找

 

int SeqDearch(SeqList& L, DataType x){

    L.data[L.n]=x;//设置监视哨
    int i;
    for(i=0;L.data[i].key!=x.key;i++);
    return (i>=L.n)?-1:i;
}

 

折半查找

//n个元素存放在有序顺序表,先求位于区间中间元素的下标mid,用其
//关键码L.data[mid].key与给定值比较
int BinSearch(OrderedList& L,DataType x, int& is){
    int l=0.r=L.n-1,mid;
    while(left<=right){
        mid=(l+r)/2;
        is=mid;
        if(x.key==L.data[mid].key)
            return mid;
        else{
        if(x.ley>L.data[mid].key)
            left=mid+1;
        else
            right=mid-1;
    }
}
is=left;
return -1;
}

分块查找(索引顺序查找)

把一个线性表分成多块,每块中的节点任意存放(无序),块与块之间必须有序。第i块中所有节点的关键码都小于(或者大于)第i+1块中所有节点的关键码。建立索引表,把块中的最大关键码作为索引表的关键码,按块的顺序存放在一个数组中。

你可能感兴趣的:(数据结构)