请编写一个函数int list_revert(SLIST_S *listA, SLIST_S *listB),将传入的单向链表listA反转后返回listB,其中SLIST_S定义如下: typedef struct SLIST{ …… struct SIG_LIST *next; }SLIST_S;
时间: 2024-03-25 12:39:17 浏览: 61
好的,我来为您编写这个函数。
```c
SLIST_S* list_revert(SLIST_S *listA, SLIST_S *listB) {
SLIST_S *cur = listA, *prev = NULL, *next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
listB = prev;
return listB;
}
```
该函数中,我们用cur指针遍历链表listA,同时用prev指针指向上一个节点,next指针指向下一个节点。在每次遍历时,我们将当前节点的指针反转,并将prev指针指向当前节点,cur指针指向下一个节点。最后将listB指向反转后的链表头节点,返回listB。
需要注意的是,在调用该函数时,需要保证listA和listB已经被初始化,且listA不为空。
相关问题
请编写一个函数int list_revert(SLIST_S *listA, SLIST_S *listB),将传入的单向链表listA反转后返回listB
好的,这是一个使用递归的单向链表反转算法:
```
#include <stdio.h>
typedef struct SLIST {
int data;
struct SLIST *next;
} SLIST_S;
SLIST_S *list_revert(SLIST_S *curr, SLIST_S *prev, SLIST_S *listB) {
if (curr == NULL) {
listB = prev;
return listB;
}
SLIST_S *next = curr->next;
curr->next = prev;
prev = curr;
return list_revert(next, prev, listB);
}
int main() {
SLIST_S *listA = (SLIST_S *)malloc(sizeof(SLIST_S));
SLIST_S *listB = NULL;
listA->data = 1;
listA->next = (SLIST_S *)malloc(sizeof(SLIST_S));
listA->next->data = 2;
listA->next->next = (SLIST_S *)malloc(sizeof(SLIST_S));
listA->next->next->data = 3;
listA->next->next->next = NULL;
listB = list_revert(listA, NULL, listB);
while (listB != NULL) {
printf("%d ", listB->data);
listB = listB->next;
}
return 0;
}
```
函数接收三个参数:当前要反转的节点`curr`、反转后的上一个节点`prev`和用来存储反转后单向链表的指针`listB`。函数返回反转后的单向链表`listB`。函数使用递归的方式依次将链表中的节点反转。最后返回反转后的单向链表`listB`。
优化下列sql: INSERT INTO borrow_order_2017(id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status) SELECT * from borrow_order where IF((SUBSTR(borrow_id,1,1) REGEXP '[^0-9.]') = 1,substring(borrow_id,2,4),substring(borrow_id,1,4)) = 2017
可以尝试使用以下优化方法:
1. 使用批量插入语法,将多个INSERT语句合并成一个,可以减少网络通信的次数和开销,提高效率。
2. 在SELECT语句中使用具体的列名代替“SELECT *”,可以避免不必要的列的查询和传输。
3. 在WHERE语句中使用函数索引或者建立虚拟列,可以加快查询速度。
优化后的SQL如下所示:
```
INSERT INTO borrow_order_2017(id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status)
SELECT id, order_no, borrow_id, glc, libcode, rdid, create_time, should_revert_time, revert_time, status
FROM borrow_order
WHERE SUBSTR(borrow_id,1,1) REGEXP '[^0-9.]' = 1 AND SUBSTR(borrow_id,2,4) = '2017'
OR SUBSTR(borrow_id,1,4) = '2017';
```
这里使用了具体的列名,将IF函数替换为OR语句,并将正则表达式替换为字符串匹配,可以加快查询速度。同时,可以考虑为borrow_id列建立函数索引或者虚拟列,以进一步提高查询速度。
阅读全文