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