本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
struct ListNode { int data; struct ListNode *next;};
函数接口定义:
struct ListNode *createlist();struct ListNode *deleteeven( struct ListNode *head );
函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>#include <stdlib.h>struct ListNode { int data; struct ListNode *next;};struct ListNode *createlist();struct ListNode *deleteeven( struct ListNode *head );void printlist( struct ListNode *head ){ struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n");}int main(){ struct ListNode *head; head = createlist(); head = deleteeven(head); printlist(head); return 0;}/* 你的代码将被嵌在这里 */
输入样例:
1 2 2 3 4 5 6 7 -1
输出样例:
1 3 5 7
/* 你的代码将被嵌在这里 */struct ListNode *createlist(){struct ListNode *pt;pt = (struct ListNode *)malloc(sizeof(struct ListNode));struct ListNode *head, *tail;head = tail = NULL;scanf("%d", &pt->data);while (pt->data != -1){if (head == NULL)head = pt;elsetail->next = pt;tail = pt;pt = (struct ListNode *)malloc(sizeof(struct ListNode));scanf("%d", &pt->data);}return head;}struct ListNode *deleteeven(struct ListNode *head){struct ListNode *p1, *p2;// 先检查头结点是否while (head != NULL && head->data%2==0){p1 = head;head = head->next;free(p1);}// 头结点为空直接返回if (head == NULL){return NULL;}p1 = head;p2 = p1->next;// 头结点没问题了 看头结点以后// 后面要是没有直接跳过循环return head就行while (p2 != NULL){if (p2->data%2==0){p1->next = p2->next;free(p2);}else{p1 = p2;}// 让p2等于下一个继续检验p2 = p1->next;}return head;}
联系客服