欢迎访问宙启技术站
智能推送

队列、链表等数据结构的函数实现

发布时间:2023-06-15 15:41:54

队列是一种常用的数据结构,适用于需要按照先进先出的顺序访问元素的场合。一个队列通常包含两个指针,一个指向队头,另一个指向队尾。队列的函数实现如下:

1.初始化队列

void initQueue(queue *q){

    q->head = q->tail = NULL;

    q->size = 0;

}

队列的初始化是将队头指针和队尾指针都指向 NULL,同时队列大小 size 设置为 0。

2.入队操作

void enqueue(queue *q, int val){

    node *new_node;

    new_node = (node*)malloc(sizeof(node));

    new_node->data = val;

    new_node->next = NULL;

    if(q->tail == NULL){

        q->head = q->tail = new_node;

    }

    else{

        q->tail->next = new_node;

        q->tail = new_node;

    }

    q->size++;

}

入队操作是在队尾插入一个新的元素,需要分别考虑队列为空和队列非空的情况。在队列为空时,新节点同时是队头和队尾;在队列非空时,只需要将新节点插入到队尾即可。

3.出队操作

int dequeue(queue *q){

    if(q->head == NULL){

        printf("Queue is empty.

");

        return INT_MIN;

    }

    node *temp = q->head;

    int ret = temp->data;

    q->head = q->head->next;

    if(q->head == NULL){

        q->tail = NULL;

    }

    free(temp);

    q->size--;

    return ret;

}

出队操作是从队头删除一个元素,需要分别考虑队列为空和队列非空的情况。在队列为空时,输出错误信息并返回一个特定值(这里使用 INT_MIN);在队列非空时,只需要删除队头元素即可。

4.判断队列是否为空

bool isEmpty(queue *q){

    return (q->size == 0);

}

队列为空当且仅当队列大小为 0。

链表是一种常用的数据结构,它由若干个节点组成,每个节点包含一个数据项和一个指向下一个节点的指针。链表的函数实现如下:

1.初始化链表

void initList(list *L){

    L->head = NULL;

    L->size = 0;

}

链表的初始化是将头指针指向 NULL,同时链表大小 size 设置为 0。

2.插入节点

void insertNode(list *L, int pos, int val){

    if(pos < 0 || pos > L->size){

        printf("Invalid position.

");

        return;

    }

    node *new_node;

    new_node = (node*)malloc(sizeof(node));

    new_node->data = val;

    if(pos == 0){

        new_node->next = L->head;

        L->head = new_node;

    }

    else{

        node *temp = L->head;

        for(int i = 0; i < pos - 1; i++){

            temp = temp->next;

        }

        new_node->next = temp->next;

        temp->next = new_node;

    }

    L->size++;

}

插入节点操作是在链表的某一个位置插入一个新的节点。需要分别考虑插入位置是否合法和插入位置是否为头节点的情况。如果插入位置为头节点,直接将新节点插入到头指针所指向的位置;如果插入位置为其他位置,需要先找到插入位置的前一个节点,将新节点插入到该节点的后面。

3.删除节点

void deleteNode(list *L, int pos){

    if(pos < 0 || pos >= L->size){

        printf("Invalid position.

");

        return;

    }

    node *temp, *prev;

    if(pos == 0){

        temp = L->head;

        L->head = temp->next;

    }

    else{

        prev = L->head;

        for(int i = 0; i < pos - 1; i++){

            prev = prev->next;

        }

        temp = prev->next;

        prev->next = temp->next;

    }

    free(temp);

    L->size--;

}

删除节点操作是从链表的某一个位置删除一个节点。需要先判断删除位置是否合法,并分别处理删除位置为头节点和其他节点的情况。如果删除位置为头节点,直接将头指针指向第二个节点;如果删除位置为其他位置,需要先找到删除位置的前一个节点,将该节点的 next 指针指向删除位置的下一个节点。

4.获取节点数

int getSize(list *L){

    return L->size;

}

获取节点数操作是返回链表的节点数,即链表大小 size 的值。

总结:

队列和链表是两种常用的数据结构,它们都具有各自的特点和优势,可根据具体的应用场景选择使用。队列主要用于需要按照先进先出的顺序访问元素的场合,而链表则可以实现更复杂的数据结构,如栈和哈希表等。队列和链表的实现都需要注意边界条件,避免出现空指针和越界的情况。