|
27-11-2006, 21:54
|
|
|
|
חבר מתאריך: 15.08.06
הודעות: 465
|
|
אוקיי,
אז כמו שאני עשיתי, מה שאני חושב שיותר יפה, ילך ככה:
קוד PHP:
#include <stdio.h> #include <stdlib.h>
struct stack { int num; struct stack *next; };
void push (struct stack** stack1, int num) { struct stack* stack2 = *stack1; *stack1 = (struct stack*)malloc(sizeof(struct stack)); (*stack1)->num = num; (*stack1)->next = stack2; }
void pop (struct stack** stack1) { if (*stack1 == NULL) { return; } else { struct stack *temp = *stack1; *stack1 = (*stack1)->next; free(temp); } }
void delstack (struct stack** stack1) { while (*stack1) pop (stack1); }
int peek (struct stack** stack1) { int i; if (*stack1 != NULL){ return (*stack1)->num; }else return NULL; }
void Usort(struct stack** stack1, struct stack** stack2, struct stack** stack3){ while ((*stack1!=NULL) || (*stack2!=NULL)) { if (peek(stack1) > peek(stack2)) if (!(*stack1==NULL)) { push(stack3,peek(stack1)); pop(stack1); }else{ push(stack3,peek(stack2)); pop(stack2); } else if (!(*stack2==NULL)){ push(stack3,peek(stack2)); pop(stack2); }else{ push(stack3,peek(stack1)); pop(stack1); }
}} void pass(struct stack **stack1, struct stack **stack2) { while (*stack1!=NULL){ push(stack2, peek(stack1)); pop(stack1); }}
void solve(struct stack **stack1,struct stack **stack2,struct stack **stack3){ Usort(stack1,stack2,stack3); pass(stack3,stack2); pass(stack2,stack1); pass(stack1,stack3); }
void show(struct stack* stack1){ struct stack* stack2; stack2=stack1; while (stack2!=NULL) { printf ("%2d", (stack2)->num); stack2=(stack2)->next; } }
int main() { struct stack* stack1=NULL; struct stack* stack2=NULL; struct stack* stack3=NULL; push(&stack1,1); push(&stack1,4); push(&stack1,7); push(&stack2,2); push(&stack2,2); push(&stack2,8); printf("stack1:\n"); show(stack1); printf("\nstack2:\n"); show(stack2); solve(&stack1,&stack2,&stack3); printf("\nstack3:\n"); show(stack3); delstack(&stack1); delstack(&stack2); delstack(&stack3); }
אבל, אם אתה מתעקש לא להשתמש בפונקצית Peek שתחזיר ערך כלשהו במקרה שהמחסנית ריקה, תממש כך:
קוד PHP:
#include <stdio.h> #include <stdlib.h>
struct stack { int num; struct stack *next; };
........ ........ ........
void pass(struct stack **stack1, struct stack **stack2) { while (*stack1!=NULL){ push(stack2, (*stack1)->num); pop(stack1); }}
void Usort(struct stack** stack1, struct stack** stack2, struct stack** stack3){ while ((*stack1!=NULL) && (*stack2!=NULL)) { if ((*stack1)->num > (*stack2)->num){ push(stack3,(*stack1)->num); pop(stack1); }else{ push(stack3,(*stack2)->num); pop(stack2);
} }if (*stack1==NULL) pass(stack2,stack3); else pass(stack1,stack3);
}
void solve(struct stack **stack1,struct stack **stack2,struct stack **stack3){ Usort(stack1,stack2,stack3); pass(stack3,stack2); pass(stack2,stack1); pass(stack1,stack3); }
void show(struct stack* stack1){ struct stack* stack2; stack2=stack1; while (stack2!=NULL) { printf ("%2d", (stack2)->num); stack2=(stack2)->next; } }
int main() { ... ... ... }
_____________________________________
Any sufficiently advanced bug is indistinguishable from a feature
|
|