队列、链表等数据结构的函数实现
队列是一种常用的数据结构,适用于需要按照先进先出的顺序访问元素的场合。一个队列通常包含两个指针,一个指向队头,另一个指向队尾。队列的函数实现如下:
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 的值。
总结:
队列和链表是两种常用的数据结构,它们都具有各自的特点和优势,可根据具体的应用场景选择使用。队列主要用于需要按照先进先出的顺序访问元素的场合,而链表则可以实现更复杂的数据结构,如栈和哈希表等。队列和链表的实现都需要注意边界条件,避免出现空指针和越界的情况。
