本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode { int data; struct ListNode *next; };
函数接口定义:
struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *head );
函数createlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven
将单链表head
中偶数值的结点删除,返回结果链表的头指针。
- void push_back(struct ListNode** ppList, int x)
- {
- //assert(ppList != NULL);
- struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
- newNode->data = x;
- newNode->next = NULL;
-
- if (*ppList == NULL)
- {
- *ppList = newNode;
- return;
- }
-
- struct ListNode* end = *ppList;
-
- while (end->next != NULL)
- {
- end = end->next;
- }
-
- end->next = newNode;
- }
-
- struct ListNode* createlist()
- {
- struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
- int ret = 0;
- scanf("%d", &ret);
- if (ret != -1)
- {
- head->data = ret;
- head->next = NULL;
- }
- else
- {
- free(head);
- return NULL;
- }
-
- while (1)
- {
- scanf("%d", &ret);
- if (ret == -1)
- {
- break;
- }
-
- push_back(&head, ret);
- }
-
- return head;
- }
-
- struct ListNode* deleteeven(struct ListNode* head)
- {
- struct ListNode* prev = head;
- struct ListNode* cur = head;
-
- while (cur != NULL)
- {
- if (cur->data % 2 == 1)
- {
- prev = cur;
- cur = cur->next;
- continue;
- }
-
- if (prev == cur)
- {
- cur = cur->next;
- free(prev);
- prev = cur;
- head = cur;
- continue;
- }
-
- prev->next = cur->next;
- free(cur);
- cur = prev->next;
- }
-
- return head;
- }