1 /* 2 QQ:7878138708 3 date:2020年5月16日 4 奇数值结点链表 5 */ 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 struct ListNode { 10 int data; 11 struct ListNode *next; 12 }; 13 struct ListNode *readlist(void); 14 struct ListNode *getodd(struct ListNode **L); 15 void printlist(struct ListNode *L); 16 int main(void) 17 { 18 struct ListNode *L, *Odd; 19 L = readlist(); 20 21 Odd = getodd(&L); 22 printlist(Odd); 23 printlist(L); 24 25 return 0; 26 } 27 //新建一个链表 28 struct ListNode *readlist(void) 29 { 30 struct ListNode *head, *tail, *p; 31 int n; 32 head = tail = NULL; //表头、表尾都为空 33 scanf("%d", &n); 34 while (n != -1) { 35 //新建一个结点 36 p = (struct ListNode *)malloc(sizeof(struct ListNode)); 37 p->data = n; 38 p->next = NULL; 39 40 if (head == NULL) { 41 head = tail = p; 42 } 43 else 44 { 45 tail->next = p; 46 tail = p; 47 } 48 49 scanf("%d", &n); 50 } 51 52 return head; 53 } 54 void printlist(struct ListNode *L) 55 { 56 struct ListNode *p = L; 57 58 while (p != NULL) { 59 printf("%d ", p->data); 60 p = p->next; 61 } 62 63 printf(" "); 64 } 65 struct ListNode *getodd(struct ListNode **L) 66 { 67 struct ListNode *oddHead, *oddTail; //奇数链表头尾 68 struct ListNode *evenHead, *evenTail; //偶数链表头尾 69 struct ListNode *p, *temp; 70 71 oddHead = oddTail = NULL; 72 evenHead = evenTail = NULL; 73 p = *L; 74 //遍历原来的链表 75 while (p) { 76 temp = p; 77 p = p->next; 78 //结点值为奇数 79 if (temp->data % 2) { 80 if (oddHead == NULL) { 81 oddHead = temp; 82 oddHead->next = NULL; 83 oddTail = oddHead; 84 } else { 85 oddTail->next = temp; 86 oddTail = oddTail->next; 87 oddTail->next = NULL; 88 } 89 } else { 90 if (evenHead == NULL) { 91 evenHead = temp; 92 evenHead->next = NULL; 93 evenTail = evenHead; 94 } else { 95 evenTail->next = temp; 96 evenTail = evenTail->next; 97 evenTail->next = NULL; 98 } 99 } 100 } 101 *L = evenHead; 102 103 return oddHead; 104 }