데이터 구조 강좌 설계 보고서(1변수 다항식 계산)
문제 설명
변수가 하나인 다항식의 덧셈 계산을 구현하는 프로그래밍입니다.
기본 요구 사항
연결 목록을 사용하여 변수가 1개인 다항식의 덧셈 계산을 수행하고 계산 결과를 인쇄할 수 있습니다.
필수 지식
(1) 기본 프로그래밍 방법 및 프로그래밍 지식.
(2) 연결리스트의 이해, 운용 및 적용.
사용된 알고리즘
순회 알고리즘과 재귀 알고리즘.
운영 플랫폼
Visual C
#includelt;stdio.hgt;
#includelt;graphics.hgt;
#define MAX 100
typedef 구조체 폴리노드
{ float coef;
int expn;
구조체 폴리노드 *next;
}node;
node * create(void) /*포인터 함수, 꼬리 보간을 사용하여 변수 1개 다항식의 연결된 목록을 생성하는 포인터 유형 반환*/< /p>< p>{
노드 *h, *r, *s
float c
int e; > h=( node *)malloc(sizeof(node)); /*다항식의 헤드 노드를 생성하고 헤드 노드에 대한 저장 공간을 할당합니다*/
r=h; 항상 동적으로 연결된 목록의 현재 지점을 가리킵니다. 테이블의 끝은 꼬리 삽입을 위한 것이며 초기 값은 헤드 노드를 가리킵니다*/
printf("coef:");
scanf("f", amp; c) ; /*계수 입력*/
printf("expn: ")
scanf("d", amp ; e); /*지수 입력*/
while(c!=0.0) /*입력 계수가 0이면 다항식 입력의 끝을 나타냄*/
{
s=(node *)malloc(sizeof( node)) /*새 노드 신청*/
coef=c; 새 노드 적용 후 값*/
s-gt; expn= e /*새 노드 적용 후 값 할당*/
r-gt; ; /*꼬리 삽입을 수행하고 새 노드를 삽입합니다*/
r=s; /*r은 항상 단일 연결 목록의 끝을 가리킵니다*/
printf("coef: ");
scanf("f", amp; c);
< p> printf("expn: ");scanf("d", amp ; e);
}
r-gt; next=NULL ; /*테이블의 끝을 나타내기 위해 테이블의 다음 노드를 NULL로 설정합니다. /p>
return(h);
}
void polyadd (node *pa, node *pb) /*변수 1개 다항식 덧셈 함수, 다음 작업에 사용됨 두 개의 다항식을 추가하고,
다항식의 합계를 다항식 pa에 저장하고 다항식을 삭제합니다. pb*/
{
node *p, *q, *pre , *temp;
int sum;
p=pa-gt ;next; /* p와 q가 각각 pa 및 pb 다항식 연결 목록의 첫 번째 노드를 가리키도록 합니다* /
q=pb-gt;다음;
pre=
pa; /*합 다항식을 가리키는 위치 포인터 pa*/
while(p!=NULLamp;amp;q!=NULL) /*다항식이 모두 스캔되지 않으면 다음 작업을 수행합니다* /
{
if(p-gt; expnlt; q-gt; expn) /*p가 가리키는 다항식 지수가 q가 가리키는 지수보다 작은 경우*/
< p> {pre-gt; next=p; /*합 다항식에 p 노드 추가*/
pre=pre-gt; /p>
p=p-gt; next;
}
if(p-gt; expn==q-gt; expn) /*지수가 동일하면 해당 계수의 추가*/
sum=p-gt; if(sum!= 0)
{
coef=sum;
pre-gt; pre=pre-gt; p-gt; 다음 ;
temp=q; q=q-gt; free(temp);
}
else /* 계수의 합이 0이면 노드 p와 q를 삭제하고 포인터가 다음 노드를 가리킵니다*/
{
temp=p-gt; ; p=임시; < /p>
임시=q-gt; q=임시;
}
< p> if (q- gt; expnlt; p-gt; expn){
pre-gt; next=q /*합 다항식에 q 노드 추가* /
pre=pre-gt; 다음;
q=q-gt; >
if (p!=NULL) /*다항식 A에 나머지가 있고 나머지 노드를 합계 다항식에 추가합니다*/
next=p;
else /* 그렇지 않으면 B의 노드를 합 다항식에 추가합니다*/
pre-gt;
}
void print(node * p) /*출력 함수, 변수가 1개인 다항식을 인쇄합니다*/
{
while (p-gt; next!=NULL)
{
p=p-gt;
printf(" f*x^d", p-gt; coef , p-gt; expn);
}
}
voidcalculate() /*다항식에 값을 할당하고 계산 it*/
{ float cal=1.0, mid=0.0, las;
int j
float num, x; > int i=0;
float later=0.0;
int e[MAX]; float c[MAX]
printf("숫자를 입력하세요. :"); /*상수 값 입력*/
scanf("f", amp; num);
printf("x를 입력하세요:"); /*다음을 입력하세요. 알 수 없는 숫자 X*/
scanf("f",amp;x);
printf("e[0]을 입력하세요:"); 루프 여부를 결정하는 배열의 초기 값*/ p>
scanf("d",&e[0]);
printf("c[0]을 입력하십시오:") ;
scanf("f ", amp; c[0]);
while(e[i]!=0 amp; amp; c[i]!=0.0) /*이 루프는 다항식 계산에 사용됩니다.*/< /p>
{ cal=1;
for(j=0; jlt; e[i]; j ) /* 거듭제곱을 나타냅니다. X*/
{
cal=cal*x
}
중간; =cal*c[i-1]; /*단일 항목 표시*/
나중에 =mid;
printf("e[d] 및 c[d]를 입력하세요: ", i, i);
scanf("df", amp; e[i], amp; c[i]);
}
las=later num; /* 완전한 다항식을 나타냄*/
printf("결과는 다음과 같습니다:\n")
printf("f",las);
/*최종 계산 결과*/
sleep(3);
}
void main()
{
노드 *pa, *pb, *pc, *p, *q, *pre;
int 드라이버=VGA, 모드=VGAHI;
initgraph(amp; 드라이버 , amp; 모드, "c:\\tc ");
setbkcolor(BLUE)
setcolor(RED)
printf("환영합니다. 가봅시다!\n");
printf("다음으로 계산하는 과정을 보시겠습니다!");
printf("\npa의 계수와 표현식을 입력해주세요. :\n");
pa=create(); /*연결된 목록 함수를 호출하여 다항식 A를 생성합니다*/
print(pa);
printf("\npb의 계수와 표현식을 입력하세요:\n");
pb=create() /*마찬가지로 B를 생성합니다*/
print( pb );
p=pa-gt;next; /*다음 코드는 정렬에 사용됩니다*/
pa-gt;next=NULL;
while (p!=NULL)
{
if(pa-gt; next==NULL)
{
pa- gt ; p=p-gt; 다음;
}
/ p>{ pre=pa; q=pre-gt; 다음;
while(q!=NULL amp; p-gt; expngt; q-gt; expn) p >
{
pre=q; q=q-gt; 다음;
}
q=p-gt; p >
p-gt; 다음=pre-gt; }
}
printf("\n첫 번째 순서:\n") /*정렬된 pa를 출력합니다*/
p=pb-gt; /*다음 코드는 pb를 정렬하는 데 사용됩니다*/
pb-gt; next=NULL;
while(p!=NULL)< /p> p>
{
if(p
b-gt; next==NULL)
{
pb-gt; next=p-gt; ; next-gt; next=NULL;
}
else
{ q=pre-gt; p> while(q!=NULL amp; amp; p-gt; expngt; q-gt; expn)
{
pre=q; ;
}
q=p-gt;next;
p-gt;next=pre-gt;next;
pre-gt; next=p;
p=q;
}
}
printf("\n두 번째 주문 :\n"); print(pb); /*정렬된 pb를 출력합니다*/
printf("\n폴리의 합계는 다음과 같습니다.\n");
polyadd( pa, pb); /*1변수 다항식 덧셈 함수 호출*/
print(pa) /*출력 함수 호출 및 결과 인쇄*/
printf( "\n ");
setbkcolor(RED);
calculate() /*다항식 값을 계산하는 함수 호출*/
}< /p>
후편집 요약
로직 설계, 세부 설계, 프로그램 코딩 및 프로그램 디버깅 단계에서 이 프로그램은 원래 save() 함수와 load() 다운로드 함수를 설계했습니다. 생성된 파일을 각각 저장하고 계산해야 하는 다른 다항식 데이터를 다운로드하는 데 사용되므로 이 시스템이 더 실용적일 수 있습니다. void createadj()의 원래 함수 프로토타입은 arcnode *createdj() 함수를 사용합니다. adjmatrix[][]의 데이터를 저장하기 위한 목록 구조이므로 데이터를 저장할 수 있지만 Dijkstra의 adjmatrix[][]를 아크노드 포인터로 변환해야 합니다. 이 방법으로만 다운로드한 데이터를 사용할 수 있기 때문입니다. 하지만 최종 디버깅 단계에서 dijkstra가 실행되지 않는 것으로 확인되었으며, save() 함수로 adjmatrix[][]를 저장하기 어려워 결국 save()와 load()만 포기했다. 함수를 생성하고 main() 함수에서 초기화했습니다. 이번 프로그래밍을 통해 내 자신의 단점을 알게 되었고, 앞으로는 데이터 구조 프로그래밍에 대한 지식을 배우고 익히기 위해 더 열심히 노력하겠습니다.