#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct node {
int gs; // 계수
int js; // 지수
struct node *next;
} NODE;
NODE *start[3] = {NULL};
int cnt[3] = {0};
bool rage_flag = false;
void del(int i);
void init(int i);
void rage();
void insert(int i, int g, int j);
void print();
void init(int i)
{
NODE *del, *cur = start[i];
if(start[i] == NULL)
return;
else {
while(cur->next != NULL) {
del = cur;
cur = cur->next;
free(del);
}
del = cur;
start[i] = NULL;
free(del);
}
}
void del(int i)
{
NODE *del, *cur = start[i];
while(cur->next != NULL) {
if(cur->next->gs == 0) {
del = cur->next;
cur->next = del->next;
free(del);
cnt[i]--;
return;
}
cur = cur->next;
}
if(start[i]->gs == 0) {
del = start[i];
start[i] = start[i]->next;
free(del);
cnt[i]--;
return;
}
}
void rage()
{
int i;
if(start[0] == NULL || start[1] == NULL) {
printf("먼저 A랑 B를 채워\n");
return;
}
init(2);
for(i = 0; i < 2; i++) {
NODE *cur = start[i];
while(cur->next != NULL) {
insert(2, cur->gs, cur->js);
cur = cur->next;
}
insert(2, cur->gs, cur->js);
}
rage_flag = true;
}
void insert(int i, int g, int j)
{
NODE *newnode, *cur;
newnode = (NODE*)malloc(sizeof(NODE));
newnode->next = NULL;
newnode->gs = g;
newnode->js = j;
cur = start[i];
rage_flag = false;
if(start[i] != NULL) {
while(cur->next != NULL) {
if(cur->js == j) {
cur->gs += g;
if(cur->gs == 0)
del(i);
return;
}
cur = cur->next;
}
if(cur->js == j) {
cur->gs += g;
if(cur->gs == 0)
del(i);
return;
}
cur = start[i];
}
if(start[i] == NULL || start[i]->js < newnode->js) {
newnode->next = start[i];
start[i] = newnode;
cnt[i]++;
return;
}
if(cur->js >= newnode->js) {
while(cur->next != NULL) {
if(cur->next->js <= newnode->js) {
newnode->next = cur->next;
cur->next = newnode;
cnt[i]++;
return;
}
cur = cur->next;
}
cur->next = newnode;
cnt[i]++;
}
}
void print()
{
int i, minus;
for(i = 0; i < 3; i++) {
NODE *cur = start[i];
if(i == 0)
printf("A = ");
else if(i == 1)
printf("B = ");
else
printf("C = ");
if(start[i] == NULL) {
if(i == 2) {
printf("아직 합치지 않았어\n");
continue;
}
printf("이 배열은 비어있어\n");
continue;
}
else {
if(i == 2 && !rage_flag) {
printf("다시 합쳐\n");
continue;
}
}
printf("%dX^%d", cur->gs, cur->js);
if(cur->next != NULL)
cur = cur->next;
else{
printf("\n");
continue;
}
while(cur->next != NULL) {
if(cur->gs > 0) {
minus = cur->gs;
printf(" + ");
}
else if(cur->gs < 0) {
minus = -cur->gs;
printf(" - ");
}
printf("%dX^%d", minus, cur->js);
cur = cur->next;
}
if(cur->gs > 0) {
minus = cur->gs;
printf(" + ");
}
else if(cur->gs < 0) {
minus = -cur->gs;
printf(" - ");
}
printf("%dX^%d\n", minus, cur->js);
}
}
int main()
{
int sel, gs, js;
while(1) {
system("cls");
puts("1. Insert A");
puts("2. Insert B");
puts("3. Print");
puts("4. A + B");
puts("5. Initialize");
puts("6. Quit");
printf("골라 : ");
scanf("%d", &sel);
fflush(stdin);
switch(sel) {
case 1:
printf("식 A 입력\n");
printf("계수 : ");
scanf("%d", &gs);
fflush(stdin);
printf("지수 : ");
scanf("%d", &js);
insert(0, gs, js);
printf("식 A에 추가했다\n");
break;
case 2:
printf("식 B 입력\n");
printf("계수 : ");
scanf("%d", &gs);
fflush(stdin);
printf("지수 : ");
scanf("%d", &js);
insert(1, gs, js);
printf("식 B에 추가했어\n");
break;
case 3:
print();
break;
case 4:
if(rage_flag) {
printf("이미 더했어\n");
getch();
continue;
}
rage();
printf("두 식을 더했어\n");
break;
case 5:
init(0);
init(1);
init(2);
printf("모두 초기화했어\n");
break;
case 6:
exit(1);
}
getch();
}
return 0;
}
'stack overflow > C' 카테고리의 다른 글
| [C][math.h] 2차원 방정식 근 구하기 (0) | 2012.08.30 |
|---|---|
| [C][이중연결리스트] 이중연결리스트 기본형 (0) | 2012.08.09 |
| [C][단순연결리스트][1차원배열동적할당][선택정렬] 단순연결리스트 기본형 (0) | 2012.08.07 |
| [C][난수발생][선택정렬][2차원배열] 인공지능 빙고게임 (0) | 2012.08.05 |
| [C][getchar()/putchar()] 주석 제거기 (3) | 2012.08.05 |

Polynomia_src.cpp