删除单链表偶数节点 (20分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:
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
思路
本题和前边的差不多
需要注意的是创建链表可以创建成带头结点的也对,
但是返回的时候记得要返回第一个结点(根据看int main 中的程序决定出来的)(不带头结点也对只要返回第一个数的指针即可)
删除也是因为 int main中给传入的head指的是第一个结点所以要分为在头删还是在中间删
struct ListNode *createlist(){
//带有头结点的做法头结点head要先开辟空间,头结点它是有空间的不是仅有一个单纯的指针
struct ListNode *head=(struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *tail;
tail=head;
//struct ListNode *head,*tail;@1
//head=tail=NULL;@2
//@1和@2的写法是不对的那是不带头结点的写法
int Data;
while(scanf("%d",&Data)&&Data!=-1){
struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=Data;
//tail->next指的就是第一个数直接在tail->next那里存数就行不用分在头插还是在中间插
tail->next=p;
tail=p;
}
//看测试程序void printlist( struct ListNode *head )中 struct ListNode *p = head; printf("%d ", p->data);
//说明它是从第一个元素开始输出的所以返回的是第一个元素的指针head->next而不是head
return head->next;
}
//上边的做法和下边的做法都对
/*struct ListNode *createlist(){
struct ListNode *head,*tail;
head=tail=NULL;
int Data;
while(scanf("%d",&Data)&&Data!=-1){
struct ListNode *p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=Data;
if(head==NULL){
head=tail=p;
}
else{
tail->next=p;
tail=p;
}
}
return head;
}
*/
struct ListNode *deleteeven( struct ListNode *head ){
struct ListNode *p,*ptr;
while(head!=NULL){
if(head->data%2==0){
p=head;
head=head->next;
free(p);
}
else{
break;
}
}
if(head==NULL){return NULL;}
p=head;
ptr=p->next;
while(ptr!=NULL){
if(ptr->data%2==0){
p->next=ptr->next;
free(ptr);
}
else{
p=ptr;
}
ptr=p->next;
}
return head;
}
版权声明:本文为weixin_44044816原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。