用C语言,奇数值结点链表:输入若干正整数(输入-1为结束标志),建立一个单向链表,头指针为L,将链表L中奇数值的结点重新组成一个新的链表NEW,并输出新建链表的信息。试编写相应程序。
时间: 2023-06-26 10:05:38 浏览: 60
以下是用C语言编写的奇数值结点链表程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
Node *create_list() {
int val;
Node *head = NULL, *tail = NULL;
printf("请输入若干正整数,以-1结束:\n");
while (scanf("%d", &val) == 1 && val != -1) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = val;
node->next = NULL;
if (head == NULL) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
Node *separate_list(Node **head) {
Node *cur = *head, *prev = NULL, *new_head = NULL, *new_tail = NULL;
while (cur != NULL) {
if (cur->data % 2 != 0) {
if (prev == NULL) {
*head = cur->next;
} else {
prev->next = cur->next;
}
if (new_head == NULL) {
new_head = new_tail = cur;
} else {
new_tail->next = cur;
new_tail = cur;
}
cur = cur->next;
new_tail->next = NULL;
} else {
prev = cur;
cur = cur->next;
}
}
return new_head;
}
void print_list(Node *head) {
printf("链表的信息为:");
while (head != NULL) {
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
int main() {
Node *L = create_list();
Node *NEW = separate_list(&L);
print_list(L);
print_list(NEW);
return 0;
}
```
程序先定义了一个结构体 `node`,表示链表的结点,包含一个整数 `data` 和一个指向下一个结点的指针 `next`。然后定义了一个函数 `create_list`,用于创建一个单向链表。函数中使用一个循环,读取用户输入的正整数并创建结点,将结点插入链表的尾部。当用户输入 -1 时,循环结束,返回链表的头指针。
接下来是函数 `separate_list`,用于从链表中分离出所有奇数值的结点,并返回一个新的链表。函数中使用了两个指针 `cur` 和 `prev`,分别表示当前结点和前一个结点。如果当前结点的值为奇数,就将其从链表中删除,并将其插入到新链表的尾部。否则,将指针 `cur` 和 `prev` 分别向后移动一个结点。最后返回新链表的头指针。
最后是主函数 `main`,先调用函数 `create_list` 创建链表,再调用函数 `separate_list` 分离出所有奇数值的结点,分别输出原链表和新链表的内容。