本题要求使用自定义链表或使用STL之list完成。 输入n个正整数,建立单链表L,要求链表中每个结点之后所有结点的数据域值都不是该结点数据域值的倍数,输出链表L中的结点个数及各个数据域值,然后将链表L逆置并输出。用C语言生成代码
时间: 2024-10-11 22:04:37 浏览: 41
为了满足题目需求,我们可以创建一个自定义链表结构,并分别处理插入节点、检查是否符合条件和链表逆置的操作。以下是使用C语言的一个简单实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 自定义链表节点结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 插入节点到链表
void insert(ListNode** head, int value) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = value;
newNode->next = *head;
*head = newNode;
}
// 检查是否满足条件并更新链表
void updateAndReverse(ListNode** head) {
ListNode* current = *head;
while (current != NULL) {
// 遍历链表查找符合条件的节点
ListNode* nextNonMultiple = current->next;
while (nextNonMultiple != NULL && nextNonMultiple->data % current->data == 0) {
nextNonMultiple = nextNonMultiple->next;
}
if (nextNonMultiple == NULL) {
printf("Last node %d has no multiple after it.\n", current->data);
break; // 如果当前节点是最后的,且找不到非倍数值,结束遍历
}
// 更新满足条件的节点位置
for (ListNode* prevNext = current->next; prevNext != nextNonMultiple; prevNext = prevNext->next) {
prevNext->next = prevNext->next->next;
}
current->next = nextNonMultiple;
current = current->next;
}
// 逆置链表
ListNode* prev = NULL;
ListNode* curr = *head;
ListNode* next = NULL;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
*head = prev; // 设置新头节点
}
// 打印链表中的元素
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
int n, num;
printf("Enter the number of nodes: ");
scanf("%d", &n);
ListNode* head = NULL;
for (int i = 0; i < n; ++i) {
scanf("%d", &num);
insert(&head, num);
}
printf("Original list:\n");
printList(head);
updateAndReverse(&head);
printf("\nReversed and updated list:\n");
printList(head);
return 0;
}
```
阅读全文