'struct ListNode'函数的声明
时间: 2023-12-03 09:02:53 浏览: 105
这是一个C++中定义链表节点的结构体声明:
```
struct ListNode {
int val; // 存储节点的值
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 构造函数,初始化节点值和指针
};
```
其中,`val`存储节点的值,`next`指向下一个节点的指针。构造函数用于初始化节点值和指针。
相关问题
本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头。链表结点定义如下: struct ListNode { int data; struct ListNode *next; }; 函数接口定义: struct ListNode *reverse( struct ListNode *head ); 其中head是用户传入的链表的头指针;函数reverse将链表head逆置,并返回结果链表的头指针。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *createlist(); /*裁判实现,细节不表*/ struct ListNode *reverse( struct ListNode *head ); void printlist( struct ListNode *head ) { struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { struct ListNode *head; head = createlist(); head = reverse(head); printlist(head); return 0; }
以下是完整的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *reverse(struct ListNode *head);
struct ListNode *createlist()
{
int n, i;
scanf("%d", &n);
struct ListNode *head = NULL, *p = NULL;
for (i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
struct ListNode *new_node = (struct ListNode*)malloc(sizeof(struct ListNode));
new_node->data = x;
new_node->next = NULL;
if (head == NULL) {
head = new_node;
p = head;
} else {
p->next = new_node;
p = new_node;
}
}
return head;
}
void printlist(struct ListNode *head)
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *head;
head = createlist();
head = reverse(head);
printlist(head);
return 0;
}
struct ListNode *reverse(struct ListNode *head)
{
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *prev = NULL, *cur = head, *next = head->next;
while (next != NULL) {
cur->next = prev;
prev = cur;
cur = next;
next = next->next;
}
cur->next = prev;
return cur;
}
```
解释如下:
首先是链表的创建,不需要修改。然后是主函数,调用了 `createlist` 创建链表,再调用 `reverse` 函数将链表逆置,最后再调用 `printlist` 函数输出逆置后的链表。
关键在于 `reverse` 函数的实现。我们可以使用三个指针,分别指向前一个结点、当前结点和后一个结点。在遍历链表时,将当前结点的 `next` 指针指向前一个结点,然后将三个指针依次向后移动即可。最后,别忘了将最后一个结点的 `next` 指针也指向前一个结点,然后返回新的头结点即可。
补全如下代码:#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); void printlist( struct ListNode *L ) { struct ListNode *p = L; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int m; struct ListNode *L = readlist(); scanf("%d", &m); L = deletem(L, m); printlist(L); return 0; }
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *deletem(struct ListNode *L, int m);
void printlist(struct ListNode *L);
int main() {
int m;
struct ListNode *L = readlist();
scanf("%d", &m);
L = deletem(L, m);
printlist(L);
return 0;
}
struct ListNode *readlist() {
struct ListNode *head = NULL, *tail = NULL;
int n, val;
scanf("%d", &n);
while (n--) {
scanf("%d", &val);
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->data = val;
node->next = NULL;
if (!head) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
struct ListNode *deletem(struct ListNode *L, int m) {
struct ListNode *head = NULL, *tail = NULL;
while (L) {
if (L->data != m) {
struct ListNode *node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->data = L->data;
node->next = NULL;
if (!head) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
L = L->next;
}
return head;
}
void printlist(struct ListNode *L) {
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
该代码实现了链表的基本操作,包括创建链表、删除指定元素、打印链表等。其中,`readlist()`函数用于创建链表,`deletem()`函数用于删除指定元素,`printlist()`函数用于打印链表。主函数中,通过调用`readlist()`函数创建链表,并读入需要删除的元素,然后调用`deletem()`函数进行删除操作,最后调用`printlist()`函数打印删除后的链表。
阅读全文