자료구조 과제
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode *ListPointer;
typedef struct ListNode {
int coef; //계수 저장할 변수
int expo; //지수를 저장할 변수
ListPointer link; //노드를 가리키는 link.
} ListNode;
ListPointer avail; // 포인터 avail
ListPointer getHead()
{
ListPointer head;
head = (ListPointer)malloc(sizeof(ListNode));
head->coef = 0;
head->expo = -1;
head->link = NULL;
return head;
}
void retNode(ListPointer node) // 지정된 노드를 avail로 반환
{
node->link = avail;
avail = node;
}
ListPointer getNode()
{
ListPointer node;
if (avail)
{
node = avail;
avail = avail->link;
}
else //새로 동적으로 노드를 생성
node = (ListPointer)malloc(sizeof(ListNode));
return node;
}
void attach(int cof, int exp, ListPointer *ptr) // 다항식의 덧셈결과를 가지고 새로운 노드
{
ListPointer temp;
temp = getNode();
temp->coef = cof;
temp->expo = exp;
(*ptr)->link = temp;
*ptr = temp;
}
int length(ListPointer last) //리스트의 길이를 구하는 함수
{
ListPointer temp;
int count = 0;
if (last)
{
temp = last->link;
do
{
count++;
temp = temp->link;
if (temp->link == NULL) //avail리스트는 원형
break ;
} while (temp->link != last->link);
}
return count;
}
int compare(int a_exp, int b_exp) //해당 지수의 값을 비교하여 반환값에 따라 스위치문에
{
if(a_exp < b_exp)
return -1;
else if(a_exp == b_exp)
return 0;
return 1;
}
ListPointer cpadd(ListPointer a, ListPointer b)
{
ListPointer startA, c, lastC;
int sub, done = 0; //
startA = a;
a = a->link;
b = b->link;
c = getNode();
c->expo = -1;
lastC = c;
do
{
switch(compare(a->expo, b->expo))
{
case -1:
attach(-b->coef, b->expo, &lastC);
b = b->link;
break;
case 0:
if (startA == a) done = 1;
else
{
sub = a->coef - b->coef;
attach(sub, a->expo, &lastC);
a = a->link;
b = b->link;
}
break;
case 1:
attach(a->coef, a->expo, &lastC);
a = a->link;
}
} while (!done);
lastC->link = c;
return c;
}
void createList(ListPointer h, int num1, int num2) //계수와 지수를 가지고 새로운 리스트를
{
ListPointer newnode;
ListPointer p;
newnode = getNode();
newnode->coef = num1;
newnode->expo = num2;
if(h->link == NULL)
{
h->link = newnode;
newnode->link = h;
}
else
{
p = h->link;
while (p->link != h)
p = p->link;
newnode->link = h;
p->link = newnode;
}
}
void polyPrint(ListPointer p) // 다항식을 출력함.
{
ListPointer temp;
temp = p->link;
while (temp->link != p->link)
{
printf("%d^%d", temp->coef, temp->expo);
temp = temp->link;
if (temp->link != p->link)
printf(" + ");
}
}
void cerase(ListPointer *ptr) //원형리스트를 제거
{
ListPointer temp;
if (*ptr)
{
temp = (*ptr)->link;
(*ptr)->link = avail;
avail = temp;
*ptr = NULL;
}
}
int ft_form_len(char *form)
{
int ret;
ret = 0;
while (*form)
{
if (*(form++) == '^')
ret++;
}
return (ret);
}
int ft_get_num(char *str)
{
int num = 0;
while (*str && *str != '^' && *str != '+')
num = num * 10 + *(str++) - 48;
return num;
}
int ft_get_dec(int num)
{
int ret;
ret = 0;
if (num < 0)
num *= -1;
while (num)
{
ret++;
num /= 10;
}
return (ret);
}
void ft_get_stk(char *form, ListPointer ptr)
{
int i = 0;
int num1, num2, flag;
int form_len = ft_form_len(form);
while (i < form_len)
{
flag = 1;
if (*form == '-')
{
flag = -1;
form++;
}
num1 = ft_get_num(form) * flag;
form += ft_get_dec(num1) + 1;
flag = 1;
if (*form == '-')
{
flag = -1;
form++;
}
num2 = ft_get_num(form) * flag;
createList(ptr, num1, num2);
form += ft_get_dec(num2) + 1;
i++;
}
}
int main (void)
{
char form1 = malloc(255);
char form2 = malloc(255);
ListPointer a, b, c;
avail = getHead();
a = getHead();
b = getHead();
printf("다항식 1 입력: ");
scanf("%s", form1);
ft_get_stk(form1, a);
printf("\n");
printf("다항식 2 입력: ");
scanf("%s", form2);
ft_get_stk(form2, b);
free(form1);
free(form2);
c = cpadd(a, b);
printf("\n");
printf("두 다항식의 차 = ");
polyPrint(c);
cerase(&a);
cerase(&b); //a,b리스트를 avail 리스트로 반환
return 0;
}
Author And Source
이 문제에 관하여(자료구조 과제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@spolice/자료구조-과제저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)