本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中奇数值的结点重新组成一个新的链表。链表结点定义如下:
struct ListNode { int data; ListNode *next; };
函数接口定义:
struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L );
函数readlist
从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−时表示输入结束,函数应返回指向单链表头结点的指针。
函数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(" "); } int main() { struct ListNode *L, *Odd; L = readlist(); Odd = getodd(&L); printlist(Odd); printlist(L); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
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 *head,*tail,*temp; //head->头节点,tail->尾节点,temp->临时开辟节点 tail = temp = (struct ListNode*)malloc(sizeof(struct ListNode));//尾节点开始也指向临时开辟节点 head = NULL; int cnt = 0;//节点个数 scanf("%d",&temp->data); while(temp->data != -1){ cnt++; if (cnt == 1) head = temp; else tail->next=temp; tail = temp; temp = (struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d",&temp->data); } tail->next=NULL; return head; }; struct ListNode *getodd( struct ListNode **L ){ //struct ListNode *p = *L; struct ListNode *odd_head,*odd_tail,*odd_temp;//新得奇数链表 struct ListNode *even_head,*even_tail;//新得偶数链表 odd_tail = even_tail = odd_temp = malloc(sizeof(struct ListNode)); odd_head = even_head = NULL; int cnt1 = 0,cnt2 = 0;//cnt1为奇书链表节点个数,cnt2为偶数链表节点个数 while(*L){ odd_temp->data = (*L)->data; odd_temp->next = NULL; if ((*L)->data%2 == 1) {//奇数节点 cnt1++; if (cnt1 == 1) odd_head = odd_temp;//插入奇数链表 else odd_tail->next = odd_temp; odd_tail = odd_temp; } else {//偶数节点 cnt2++; if (cnt2 == 1) even_head = odd_temp; else even_tail->next = odd_temp; even_tail = odd_temp; } odd_temp = (struct ListNode*)malloc(sizeof(struct ListNode)); *L = (*L)->next; } *L = even_head; return odd_head; }; // void printlist( struct ListNode *L ) // { // struct ListNode *p = L; // while (p) { // printf("%d ", p->data); // p = p->next; // } // printf(" "); // } int Main() { struct ListNode *L, *Odd; L = readlist(); Odd = getodd(&L); printlist(Odd); printlist(L); return 0; } /* 你的代码将被嵌在这里 */