本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
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* head, *tail, *p;int num;head = NULL; //head = tail = NULL;这样也可以,是个更好的习惯//p = (struct ListNode*)malloc(sizeof(struct ListNode));这里注释掉。是因为每次输入数据都要重新申请一块内存,所以直接放循环里面,当然不注释也行,循环里面的那句可以相应后移。scanf("%d",&num);while(num != -1){p = (struct ListNode*)malloc(sizeof(struct ListNode));p->data = num;p->next = NULL;if (head == NULL){ //尾插head = p;tail = p;}else{tail->next = p;tail = p;}scanf("%d",&num);}return head;
}struct ListNode *deleteeven( struct ListNode *head ){struct ListNode* p, *q;while((head != NULL) && (head->data % 2 == 0)){ //最开始这里用的是if条件语句,改成while后就可以了。因为可能头节点是偶数,第二个节点还是偶数p = head->next;free(head);head = p;}if(head != NULL){p = head;q = head->next;while(q != NULL){if((q->data) % 2 == 0){p->next = q->next;free(q);q = p->next;}else{p = q;q = q->next;}}}return head;
}