struct node{ int data; struct node *next; } 编程实现:输入一个正整数 n (0<n<10),做 n 次下列运算: 输入若干个正整数(输入-1为结束标志),建立一个单向链表,将其中的奇数值结点删除后输出,若删除后链表为空则输出null。
时间: 2023-05-31 14:19:29 浏览: 160
### 回答1:
以下是实现代码:
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
};
void delete_odd(struct node **head){
struct node *p = *head;
struct node *prev = NULL;
while(p != NULL){
if(p->data % 2 == 1){
if(prev == NULL){
*head = p->next;
free(p);
p = *head;
}
else{
prev->next = p->next;
free(p);
p = prev->next;
}
}
else{
prev = p;
p = p->next;
}
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++){
struct node *head = NULL;
int num;
scanf("%d", &num);
while(num != -1){
struct node *p = (struct node*)malloc(sizeof(struct node));
p->data = num;
p->next = head;
head = p;
scanf("%d", &num);
}
delete_odd(&head);
if(head == NULL){
printf("null\n");
}
else{
struct node *p = head;
while(p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
return 0;
}
### 回答2:
解析:
首先,我们需要定义一个结构体来表示链表结点。上述的 struct node 结构体包含两个元素:data 和 next,其中 data 存储结点的值,next 存储指向下一个结点的指针。
其次,我们需要处理输入。题目要求输入 n 次,每次建立一个单向链表。我们可以使用一个 while 循环来实现。在每次循环中,先输入若干个正整数,使用 malloc 函数动态地申请内存空间创建链表结点并存储对应的数值。每次创建结点时,将它插入链表头部。此外,在插入结点时,可以使用一个辅助结点来帮助定位链表头部,同时记录链表的长度,以便删除操作时进行判断。
最后,根据题目要求,需要在链表中删除所有奇数值结点。可以使用一个 while 循环遍历链表,对于每个元素,判断它的值是否为奇数。如果是,就从链表中删除该结点。注意,在删除结点时,需要同时释放内存空间,以防止内存泄漏。如果删除后链表为空,则输出 null。
代码如下:
### 回答3:
题目描述:
定义一个结构体node,包含一个int类型的数据成员和一个指向下一个结点的指针。
输入一个正整数n,代表要进行n次操作,每次操作需要输入一些正整数来建立一个单向链表,然后将其中所有奇数值的结点删除,最后输出链表;如果删除后链表为空,则输出null。
思路分析:
首先,我们需要循环输入n次,每次输入若干个正整数来建立一个链表。
接下来,我们需要定义一个指向链表头结点的指针。
然后,我们需要遍历链表,找到奇数值结点并进行删除。这个过程可以通过定义两个指针,分别指向当前结点和前一个结点,使用while循环进行遍历,逐个判断结点的奇偶性并进行删除操作。
最后,我们需要输出链表,如果链表为空,则输出null。
代码实现:
```
#include <stdio.h>
#include <stdlib.h>
struct node{
int data;
struct node *next;
};
int main(){
int n, x;
struct node *head, *p, *pre;
printf("请输入正整数n(0<n<10):");
scanf("%d", &n);
while(n--){
head = NULL; //每次循环前,初始化头结点为空
printf("请输入若干个正整数,以-1结束:");
scanf("%d", &x);
while(x!=-1){
p = (struct node*)malloc(sizeof(struct node)); //新建结点
p->data = x; //设置结点数据
p->next = head; //将该结点插入链表头部
head = p; //设置头指针为新的结点
scanf("%d", &x);
}
pre = NULL; //初始化前一个结点为空
p = head; //当前结点指向头结点
while(p!=NULL){
if(p->data % 2 == 1){ //判断结点是否为奇数
if(p==head){ //特殊情况:头结点为奇数
head = p->next; //删除头结点
free(p);
p = head; //当前结点指向新头结点
}
else{
pre->next = p->next; //删除当前结点
free(p);
p = pre->next; //当前结点指向下一个结点
}
}
else{ //当前结点为偶数
pre = p; //记录前一个结点
p = p->next; //当前结点指向下一个结点
}
}
//输出链表
if(head == NULL){
printf("null\n");
}
else{
p = head;
while(p!=NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
return 0;
}
```
阅读全文