复制
收藏
提问
简洁
通过完成函数实现以下程序功能:输入若干个自然数依次存入链表,输入-1代表结束,将链表反序并输出反序后链表内容,输入输出示意如下: 10 3 7 1 2 12 23 2232 2 21 -1 21 2 2232 23 12 2 1 7 3 10 【注意】:以下程序代码只允许添加不允许修改。 #include <stdio.h> #include <malloc.h> struct SNode{ int num; /*数值*/ struct SNode* next; /*下一个节点地址*/ }; struct SNode* addtail(struct SNode* head, int num){ } struct SNode* addHead(struct SNode* head, struct SNode* node){ } struct SNode* reversal(struct SNode* head){ } void write(struct SNode* p){ } void freelink(struct SNode* head){ } int main() { struct SNode* head = NULL; int num; do { scanf("%d", &num); if (num != -1) head = addtail(head, num); } while (num != -1); head=reversal(head); write(head); freelink(head); return 0; }
3月前
全网
文档
学术
百科
知识库
回答简洁模式
深入研究一些
要实现程序功能,需要完成几个关键步骤:创建链表、反转链表、输出链表内容以及释放链表内存。以下是每个函数的实现方法:
创建链表 addtail
struct SNode* addtail(struct SNode* head, int num){
struct SNode* newNode = (struct SNode*)malloc(sizeof(struct SNode));
newNode->num = num;
newNode->next = NULL;
if (head == NULL) {
return newNode; // 如果链表为空,返回新节点作为头节点
} else {
struct SNode* current = head;
while (current->next != NULL) {
current = current->next; // 遍历到链表末尾
}
current->next = newNode; // 将新节点添加到链表末尾
return head; // 返回头节点
}
}
这段代码首先为新元素创建一个新节点,并将其添加到链表的末尾。如果链表为空,则新节点成为头节点。
反转链表 reversal
struct SNode* reversal(struct SNode* head){
struct SNode* prev = NULL;
struct SNode* current = head;
struct SNode* next = NULL;
while (current != NULL) {
next = current->next; // 保存下一个节点
current->next = prev; // 反转当前节点的指针
prev = current; // 移动prev到当前节点
current = next; // 移动current到下一个节点
}
head = prev; // 新的头节点是prev
return head;
}
这个函数通过迭代链表并逐个反转节点的指针来实现链表的反转。
输出链表内容 write
void write(struct SNode* p){
struct SNode* current = p;
while (current != NULL) {
printf("%d ", current->num);
current = current->next;
}
printf("\n");
}
write
函数遍历链表并打印每个节点的数值。
释放链表内存 freelink
void freelink(struct SNode* head){
struct SNode* current = head;
while (current != NULL) {
struct SNode* temp = current;
current = current->next;
free(temp);
}
}
freelink
函数释放链表中所有节点的内存。
你觉得结果怎么样?