本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
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;
}