pintia上浙大的链表题目,求助!

NJUPT-BUGMAKER 2021-04-06 11:13:01
题目要求:实现两个函数struct ListNode *readlist()与struct ListNode *getodd( struct ListNode **L )分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。
输入样例:1 2 2 3 4 5 6 7 -1
输出样例:1 3 5 7
2 2 4 6
以下为我的代码
#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()
{
int num;
struct ListNode *p,*head,*tail;
head=tail=NULL;
while(scanf("%d",&num)){
if(num==-1)break;
p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
}
return head;
}
struct ListNode *getodd( struct ListNode **L )//L是头指针的地址 *L即为头指针
{
struct ListNode *p=NULL,*head=NULL,*tail=NULL,*p2=NULL,*p1=NULL;//此时的head是奇数链的头指针
p1=*L;
while(p1){
if(p1->data%2){
if(head==NULL)
head=p1;
else
tail->next=p1;
tail=p1;
//建立新的奇数链
if(p1==*L)
*L=p1->next;
else
p2->next=p1->next;
}
else{
p2=p1;
p1=p1->next;
}
}
return head;

}

评测结果如下

小白一枚,求大佬不吝指出问题!
...全文
265 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjhjxj 2021-04-07
  • 打赏
  • 举报
回复
供参考:
#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()
{
	int num;
	struct ListNode *p,*head,*tail;
	head=tail=NULL;
	while(scanf("%d",&num)){
                if(num==-1)break;
                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;
                }
    }
    return head;
}

struct ListNode *getodd( struct ListNode **L )//L是头指针的地址 *L即为头指针
{
	struct ListNode *head=NULL,*tail=NULL,*p2=NULL,*p1=NULL;
    p1=*L;                                //此时的head是奇数链的头指针
	while(p1){
              if(p1->data%2!=0){
                   if(p1==*L){
                      *L=p2=p1->next;
                   }else{
                      p2->next=p1->next;
                   }
                   if(head==NULL){ //建立新的奇数链
                      head=p1;
                      tail=p1;
                   }else{
                      tail->next=p1;
                      tail=p1;
                   }
              }else{
                   p2=p1;
              }
              p1=p1->next;
    }
    if(head!=NULL)tail->next=NULL;
    if(*L  !=NULL)p2->next=NULL;
    return head;
}
自信男孩 2021-04-07
  • 打赏
  • 举报
回复
#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()
{
int num;
struct ListNode *p,*head,*tail;
head=tail=NULL;

while(scanf("%d",&num)){
if(num==-1)
break;
p=(struct ListNode *)malloc(sizeof(struct ListNode));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
}

return head;
}
struct ListNode *getodd( struct ListNode **L )//L是头指针的地址 *L即为头指针
{

#if 1
struct ListNode *podd_head = NULL, *p, *q, *tail;

p = q = *L;

while (p) {
if (p->data % 2) {
if (!podd_head)
podd_head = p;
else
tail->next = p;
tail = p;

if (p == *L) {
*L = (*L)->next;
p = q = *L;
} else {
q->next = p->next;
p = p->next;
}
} else {
q = p;
p = p->next;
}
}

tail->next = NULL;

return podd_head;
#else
struct ListNode *p=NULL,*head=NULL,*tail=NULL,*p2=NULL,*p1=NULL;//此时的head是奇数链的头指针
p1=*L;
while(p1){
if(p1->data%2){
if(head==NULL)
head=p1;
else
tail->next=p1;
tail=p1;
//建立新的奇数链
if(p1==*L)
*L=p1->next;
else
p2->next=p1->next;
}
else{
p2=p1;
p1=p1->next;
}
}
return head;
#endif

}


供参考~

69,373

社区成员

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

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