奇数值结点链表(pta)

zerohero_z 2017-12-26 09:45:27
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:

struct ListNode {
int data;
ListNode *next;
};
函数接口定义:

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

函数getodd将单链表L中奇数值的结点分离出来,重新组成一个新的链表。返回指向新链表头结点的指针,同时将L中存储的地址改为删除了奇数值结点后的链表的头结点地址(所以要传入L的指针)。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
int data;
struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);

return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode *readlist() //从标准输入读入一系列正整数,按照读入顺序建立单链表
{
struct ListNode *head,*tail;
struct ListNode *p;
int size =sizeof(struct ListNode);
head = (struct ListNode*)malloc(size); //给头指针分配空间
head->next=NULL;
p=head; //将当前头指针地址给指针p
while(1){ //无限循环,由循环内打破
tail = (struct ListNode*)malloc(size); //每次循环都会重新给尾指针分配空间
scanf("%d",&tail->data);
if (tail->data==-1) {p->next=NULL;break;} //当输入-1时,p指针指向的下一个指针赋值为NULL然后结束循环
p->next=tail; //p->next第一次循环中等价于head->next,使其指向下一个指针 tail
p=tail; //第一次循环中等价于head指针的p指针,变成等价于指针tail,tail变成了新的头
}
head = head->next; //当输入-1时,p->next=NULL,跳出了循环以实行该语句,使得head地址为第一个tail地址
}


struct ListNode *getodd( struct ListNode **L ) //将单链表L中奇数值的结点分离出来,重新组成一个新的链表
{
struct ListNode *head,*oddhead,*evenhead,*oddtail,*eventail,*odd,*even,*first,*temp;
int size =sizeof(struct ListNode);
head = (struct ListNode*)malloc(size);
oddhead = (struct ListNode*)malloc(size); odd=oddhead;
evenhead = (struct ListNode*)malloc(size); even=evenhead;
oddhead->next=NULL;
evenhead->next=NULL;
head=*L;
first=*L;temp=first; //代表传入的指针的首地址
if(head!=NULL){
if(head->data%2!=0){oddhead=*L;odd=oddhead;}
if(head->data%2==0){evenhead=*L;even=evenhead;}
}

while(head->next!=NULL){
if(head->next->data%2!=0){ //从第二个节点开始判断 (奇数)
head=head->next;
oddtail=head;
oddhead->next=oddtail;
oddhead=oddtail;
}
else if(head->next->data%2==0){ //从第二个节点开始判断 (偶数)
head=head->next;
eventail=head;
evenhead->next=eventail;
evenhead=eventail;
}
}


if(first->data%2==0) //第一个为偶数
{
*L=first;
return odd->next;
}
else //第一个为奇数
{
*L=even->next;
return first;
}

}
...全文
936 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
love_study_PAT 2018-09-10
  • 打赏
  • 举报
回复
struct ListNode *readlist() { struct ListNode *head,*pre,*p; head=(struct ListNode*)malloc(sizeof(struct ListNode)); head->next=NULL; pre=head;//保存head地址,并替代head进行操作 while(1) { p=(struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d",&p->data); if(p->data==-1) break; p->next=NULL; pre->next=p; pre=p; } free(p); return head->next; } struct ListNode *deletem_1( struct ListNode *L)//删除奇数 { struct ListNode *head,*p; head=L; p=L->next; while(p) { if(p->data%2!=0) { L->next=p->next; free(p); p=L->next; continue; } L=p; p=p->next; } if(head->data%2!=0) head=head->next; return head; } struct ListNode *deletem_2( struct ListNode *L)//删除偶数 { struct ListNode *head,*p; head=L; p=L->next; while(p) { if(p->data%2==0) { L->next=p->next; free(p); p=L->next; continue; } L=p; p=p->next; } if(head->data%2==0) head=head->next; return head; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *head,*pre,*p,*Q;//创建一个新链表,使其与*L链表相等 head=(struct ListNode*)malloc(sizeof(struct ListNode)); head->next=NULL; pre=head; Q=*L; while(Q) { p=(struct ListNode*)malloc(sizeof(struct ListNode)); p->data=Q->data; p->next=NULL; pre->next=p; pre=p; Q=Q->next; } *L=deletem_1(*L);//得到删除奇数的链表 return deletem_2(head->next);//得到删除偶数的链表. }
自信男孩 2017-12-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );

void printlist( struct ListNode *L )
{
    struct ListNode *p = L->next;

    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main()
{
    struct ListNode *L, *Odd;
    L = readlist();
    Odd = getodd(&L);
    printf("Odd list: ");
    printlist(Odd);
    printf("Even list: ");
    printlist(L);

    return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode *readlist()
{
    struct ListNode *head,*tail;
    struct ListNode *p;
    int size = sizeof(struct ListNode);
    head = (struct ListNode*)malloc(size);
    head->next = NULL;
    p = head;
    while(1) {
        tail = (struct ListNode*)malloc(size);
        scanf("%d", &tail->data);
        if (tail->data==-1) {
            p->next = NULL;
            break;
        }
        p->next=tail;
        p = tail;
    }
    free(tail);   /* 最后一个节点申请了,但是没有用要释放掉 */

    return head;   /*返回一个带哨兵的链表*/
}


struct ListNode *getodd( struct ListNode **L )  //将单链表L中奇数值的结点分离出来,重新组成一个新的链表
{
    struct ListNode *odd_head, *prev, *pcur, *pnew;
    int size = sizeof(struct ListNode);

    odd_head = (struct ListNode *)malloc(size);
    if (!odd_head)
        exit(1);

    prev = *L;
    pcur = (*L)->next;
    pnew = odd_head;

    while (pcur) {
        if (pcur->data % 2) {
            pnew->next = pcur;
            pnew = pcur;
            prev->next = pcur->next;
            pcur = pcur->next;
        } else {
            prev = prev->next;
            pcur = pcur->next;
        }
    }
    pnew->next = NULL;

    return odd_head;
    /*
    struct ListNode *head,*oddhead,*evenhead,*oddtail,*eventail,*odd,*even,*first,*temp;
    head = (struct ListNode*)malloc(size);
    oddhead = (struct ListNode*)malloc(size);  odd=oddhead;
    evenhead =  (struct ListNode*)malloc(size); even=evenhead;
    oddhead->next=NULL;
    evenhead->next=NULL;
    head=*L;
    first=*L;temp=first;              //代表传入的指针的首地址
    if(head!=NULL){
        if(head->data%2!=0){oddhead=*L;odd=oddhead;}
        if(head->data%2==0){evenhead=*L;even=evenhead;}
    }

    while(head->next!=NULL){
        if(head->next->data%2!=0){   //从第二个节点开始判断 (奇数)
            head=head->next;
            oddtail=head;
            oddhead->next=oddtail;
            oddhead=oddtail;
        }
        else if(head->next->data%2==0){  //从第二个节点开始判断 (偶数)
            head=head->next;
            eventail=head;
            evenhead->next=eventail;
            evenhead=eventail;
        }
    }

    if(first->data%2==0)      //第一个为偶数
    {
        *L=first;
        return odd->next;
    }
    else                    //第一个为奇数
    {
        *L=even->next;
        return first;
    }
    */

}
参考一下吧,对于要求,若定义一个带哨兵的单链表会比较容易解决。详见上面的代码; 分离函数可以简单一些,没必要定义那么多指针变量,因为变量多了会让程序看着不容易理解。
zerohero_z 2017-12-26
  • 打赏
  • 举报
回复
我的第一次提问,实在不知道哪里出错了,求大佬帮帮我,我想了快一天了┭┮﹏┭┮
赵4老师 2017-12-26
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧