《数据结构》线性结构实验报告

  • 格式:docx
  • 大小:255.89 KB
  • 文档页数:17

《数据结构》线性结构实验报告

一、实验目的:

1.熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现。

2.以线性表的各种操作(建立、插入、删除等)的实现为重点。

3.熟悉栈和队列的基本运算在两种存储结构(顺序结构和链式结构)上的实现。

4.以栈的应用操作为重点。

二、实验内容:

1.已知下列两个多项表达式:

A(x)=7+3x+9x8+5x17

B(x)=8x+22x7-9x8

编写程序进行表达式的创建并求出A8,(x)+B(x)的和。

表达式类型的定义如下:

typedef struct pnode

{ int coef; //系数

int exp; //指数

struct pnode *next; //指向下一结点

}PolyList;

2.编程序,利用顺序栈或链栈的基本操作(初始化、进栈、出栈及获取栈顶元素)来实现数制转换,并设计主函数来进行调用。

3.编程序,利用顺序栈或链栈的基本操作(初始化、进栈、出栈及取栈顶元素)来实现一个中缀表达式求值,并设计主函数来进行调用。

4.编程实现链队的基本操作(队列的初始化、判队列空、入队列、出队列)来解决舞伴问题,并设计主函数来进行调用。

三、实验过程与结论:(经调试正确的源程序(核心部分)和程序的运行结果)

1、源程序:

#include

#include

typedef struct pnode

{ int coef; //系数

int exp; //指数

struct pnode *next; //指向下一结点

}PolyList;

PolyList* CreatePoly()

{

PolyList *head, *p, *tail;

int ic,ie;

head=(PolyList *) malloc (sizeof(PolyList));

head->next=NULL;

tail=head; printf("请输入系数和数(c,e),直到输入0结束:\n");

scanf("%d,%d", &ic,&ie);

while(ic!= 0)

{ p =(PolyList *)malloc(sizeof( PolyList ));

p->coef=ic;p->exp=ie;

tail->next=p;

tail=p;

tail->next=NULL;

scanf("%d,%d", &ic,&ie);

}

return(head);

}

void PolyAdd(PolyList *PLA, PolyList *PLB)

{ /*将两个多项式相加,然后将结果存放到多项式polya中,并释放多余结点*/

PolyList *pa,*pb,*tail,*s;

int sum;

pa = PLA->next;

pb = PLB->next;

tail=PLA;

PLB->next = NULL; /*指针初始化*/

while (pa != NULL && pb != NULL )

{ if ( pa->exp < pb->exp ) /*pa所指结点的指数小,将该结点插入和多项式*/

{ tail->next = pa; tail = pa; pa = pa->next; }

else if ( pa->exp > pb->exp ) /*pb所指结点的指数小,将该结点插入和多项式*/

{ tail->next = pb; tail = pb; pb = pb->next; }

else

{ sum = pa->coef + pb->coef;

if( sum!=0 ) /*若和不为0,将系数修改并插入和多项式链表 */

{ pa->coef = sum; tail->next = pa;tail = pa; pa = pa->next; s = pb; pb = pb->next;

free(s); }

else /*和为0,则删除pa与pb所指当前结点,并将pa、pb指针下移*/

{ s = pa; pa = pa->next; free(s); s = pb; pb = pb->next; free(s);}

}

}

if(!pa&&!pb)

tail->next=NULL;

else if ( pa != NULL ) /*将多项式A中剩余项连入和多项式中*/

tail->next = pa;

else /*将多项式B中剩余项连入和多项式中*/

tail->next = pb;

}

void PrintPoly(PolyList *head)

{

PolyList *p; int m=0;

p=head->next;

while(p != NULL)

{ printf("\t%5d%5d", p->coef,p->exp);

p = p->next;

m++;

if(m%4==0)printf("\n\t");

}

printf("\n\n\t多mm=%d\n",m);

}

main()

{

PolyList *PLA,*PLB;

int option;

do

{

printf("=======欢迎进入一元多项式的操作界面========\n");

printf("=======1.输入多项式A 2.输入多项式B 3.输出多项式A和B=======\n");

printf("=======4.多项式A与B相加 5.输出和多项式 0.退出=========\n");

printf("请输入需要操作的序号\n");

scanf("%d",&option);

switch(option)

{

case 1: PLA=CreatePoly();break;

case 2: PLB=CreatePoly();break;

case 3: printf("多项式A:\n");

PrintPoly(PLA);

printf("多项式B:\n");

PrintPoly(PLB);break;

case 4: PolyAdd(PLA,PLB);break;

case 5: printf("和多项式:\n");

PrintPoly(PLA);break;

case 0: printf("谢谢本次操作!\n");break;

default: printf("输入非法操作,请再次输入需要操作的序号\n");

}

}while(option!=0);

}

运行结果: 2、源程序:

#include

#include

#define MAXSIZE 1024

typedef int elemtype;

typedef struct SequenStack

{

elemtype data[MAXSIZE];

int top;

}SequenStack;

SequenStack * Init_SequenStack()

{

SequenStack * S;

S = (SequenStack *)malloc(sizeof(SequenStack));

if (S == NULL)

return S;

S->top = -1;

return S;

}

int SequenStack_Empty(SequenStack * S)//判栈空

{

if (S->top == -1)

{

return 1;

} else

{

return 0;

}

}

int Push_SequenStack(SequenStack * S, elemtype x)//入栈

{

if (S->top >= MAXSIZE - 1)

{

return 0;

}

S->top++;

S->data[S->top] = x;

return 1;

}

int Pop_SequenStack(SequenStack * S, elemtype * x)//出栈

{

if (S->top == -1)

{

return 0;

}

else

{

S->top--;

*x = S->data[S->top + 1];

return 1;

}

}

void Conversion(int N)//进制转化

{

int x;

SequenStack * S = Init_SequenStack();

while (N > 0)

{

Push_SequenStack(S, N % 2);

N = N / 2;

}

while (!SequenStack_Empty(S))

{

Pop_SequenStack(S, &x);

printf("%d", x);

}

}

void main()