编程练习5
单链表的逆转和排序练习
排序还有些问题
1 //链表逆置 指针的指针 2 #include <iostream> 3 using namespace std; 4 5 typedef struct node 6 { 7 int data; 8 node* next; 9 }node; 10 11 node* create() 12 { 13 node *h=(node*)malloc(sizeof(node)),*p; 14 h->data=0; 15 h->next=NULL; 16 p=h; 17 18 int num; 19 while(cin>>num) 20 { 21 if(num) 22 { 23 node* q=(node*)malloc(sizeof(node)); 24 q->data=num; 25 q->next=NULL; 26 p->next=q; 27 p=q; 28 } 29 else 30 break; 31 } 32 33 return h; 34 } 35 36 void sort(node* h) //非递归实现 37 { 38 node* p=h->next,*pre,*q,*s,*s1=NULL; 39 if(h==NULL || p==NULL) return; 40 pre=h; 41 q=p->next; 42 bool flag=false; 43 44 while(q) 45 { 46 s=q->next; 47 while(p!=q) 48 { 49 if(q->data<p->data) 50 { 51 if(!flag) 52 { 53 s1=p; 54 while(p->next!=q) 55 p=p->next; 56 p->next=NULL; 57 flag=true; 58 p=s1; 59 } 60 q->next=p; 61 pre->next=q; 62 break; 63 } 64 else 65 { 66 if(p->next==NULL) 67 { 68 p->next=q; 69 break; 70 } 71 else 72 { 73 pre=p; 74 p=p->next; 75 } 76 } 77 } 78 q=s; 79 pre=h; 80 p=pre->next; 81 } 82 } 83 //逆序输出 84 void reverse(node* h) 85 { 86 node* p=h->next,*q,*s,*s1; 87 if(h==NULL || p==NULL) return; 88 q=p->next; 89 s=p; 90 91 while(q) 92 { 93 s1=q->next; 94 if(s1==NULL) 95 { 96 h->next=q; 97 q->next=p; 98 s->next=NULL; 99 } 100 q->next=p; 101 p=q; 102 q=s1; 103 } 104 } 105 void print(node* h) 106 { 107 node* p=h->next; 108 while(p) 109 { 110 cout<<p->data<<" "; 111 p=p->next; 112 } 113 cout<<endl; 114 } 115 116 int main() 117 { 118 node* head; 119 head=create(); 120 121 print(head); 122 sort(head); 123 //reverse(head); 124 125 print(head); 126 127 return 0; 128 }
思想的高度决定事情的成败!
浙公网安备 33010602011771号