习题11-7 奇数值结点链表 (20 分) (带注释)

2021/8/21 10:14:54 浏览：

``````struct ListNode {
int data;
ListNode *next;
};
``````

``````struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
``````

``````#include <stdio.h>
#include <stdlib.h>

struct ListNode {
int data;
struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);

return 0;
}

/* 你的代码将被嵌在这里 */
``````

``````1 2 2 3 4 5 6 7 -1
``````

``````1 3 5 7
2 2 4 6
``````

``````struct ListNode *readlist()
{
// 创建一个头结点（带头结点的链表更加易于操作）
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->data = 0;
head->next = NULL;

// 创建一个尾指针（尾指针便于在表尾插入结点 ）
struct ListNode *tail = head;

// read data
int value;
scanf("%d", &value);
while (value != -1) {
struct ListNode *p = (struct ListNode *)malloc(sizeof(struct ListNode));
p->data = value;
p->next = NULL;
tail->next = p;
tail = p;
scanf("%d", &value);
}

// 返回头结点后面的那个结点（第一个结点）
return head->next;
}

struct ListNode *getodd( struct ListNode **L ) {
// 创建一个头结点（带头结点的链表更加易于操作）
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->data = 0;
head->next = NULL;

// 创建一个尾指针（尾指针便于在表尾插入结点 ）
struct ListNode *tail = head;

// 遍历链表*L，删除值为奇数的结点,pre->next = now->next
struct ListNode *now = *L;
struct ListNode *pre = (struct ListNode *)malloc(sizeof(struct ListNode));
pre->data = 0;
pre->next = now;
int flag = 1;
while (now) {
if (now->data % 2 != 0) {
pre->next = now->next;
// 把now插入到odd
tail->next = now;
tail = now;
} else {
pre = now;
if (flag) { // 记录第一个值为偶数的结点的地址
*L = now;
flag = 0;
}
}
now = now->next;
}
// 如果*L只有奇数，那么*L将成为一个空链表
if (flag) *L = NULL;

// 把odd最后一个结点处理好
tail->next = NULL;

// 返回头结点后面的那个结点（第一个结点）
return head->next;
}
``````