题目如下:(共三小题)
题目一:
顺序表:编写一个程序,其功能是:在一个非递减的顺序表中,删除所有值相等的多余元素,并输出删除前后的元素。要求时间复杂度为O(n),空间复杂度为O(1)。
代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList(SqList &L)
{
L.elem=new ElemType[100];
L.length =10;
return 1;
}
Status DeleteList(SqList &L)
{
int j=0,k,i,m;
i=L.elem[j];
while(j<L.length)
{
for(k=0;k<L.length;k++)
if(i==L.elem[k]&&k!=0)
{
for(m=k;m<L.length;m++)
L.elem[m]=L.elem[m+1];
L.length=L.length-1;
}
j=j+1;
i=L.elem[j];
}
return 1 ;
}
int main()
{
system("color 8a");
SqList L;
InitList(L);
int i,j;
printf("请输入元素:");
for(i=0;i<10;i++)
{
scanf("%d",&L.elem[i]);
printf(" ");
}
printf("\n");
DeleteList(L);
printf("恭喜你删除成功!");
printf("\n");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
printf("\n");
}
运行截图:
题目二:
链表:
约瑟夫环。编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。
利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。
例如m的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4,出列的顺序为6,1,4,7,2,3,5。
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node* PNode;
struct node {
int info;
int key;
PNode link;
};
typedef struct node* LinkList;
int res[7];
PNode create_node()
{
PNode q = (PNode)malloc(sizeof(struct node));
if (q == NULL) return NULL;
else return q;
}
int count = 0;
LinkList inti_list(int* key, int n)
{
LinkList palist = (LinkList)malloc(sizeof(struct node));
PNode p;
int i, j = 1;
p = create_node();
if (p)
{
p->key = key[0];
p->link = NULL;
palist = p;
}
for (i = 1; i < n; i++)
{
PNode q = create_node();
if (q) {
q->key = key[i];
p->link = q;
q->link = NULL;
p = q;
}
}
if (i == 7) {
p->link = palist;
}
PNode t = palist;
while (t->link != palist)
{
t->info = j;
j++;
t = t->link;
}
t->info = 7;
return palist;
}
void jose_out(LinkList palist, int m, int n)
{
if (n > 0)
{
PNode p = palist;
for (int i = 0; i < m - 2; i++) p = p->link;
printf("\出队的元素是 %d\n", p->link->info);
res[count++] = p->link->info;
int next_m = p->link->key;
printf("下一轮循环次数%d,", next_m);
p->link = p->link->link;
palist = p->link;
printf("下一轮开始位置:%d\n", palist->info);
--n;
jose_out(palist, next_m, n);
}
}
int main()
{
system("color 8a");
int m = 20;
int key[7] = { 3,1,7,2,4,8,6 };
LinkList list = inti_list(key, 7);
printf("出队过程如下:\n");
jose_out(list, m, 7);
printf("\n所以出队顺序依次为:\n");
for (int i = 0; i < 7; i++)
{
printf("%d\t", res[i]);
}
}
运行截图:
题目三:
链表应用:一元多项式运算器。
基本要求:
(1) 输入并建立多项式,并用友好的界面显示多项式,如,8x3-6x2+8显示为8x^3-6x^2+8;
(2)计算两个多项式的加法和减法;
(3)给定x,计算多项式在x处的值。
代码:
#include<stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Node
{
int a;
int b;
struct Node *next;
}Node,*List;
void init(List *L)
{
(*L)=(List)malloc(sizeof(Node));
(*L)->next=NULL;
}
void Set(List L)
{
Node *p,*r;
r=L;
int i=0,n,m;
scanf("%d %d",&n,&m);
while(m!=-1)
{
p=(List)malloc(sizeof(Node));
p->a=n;
p->b=m;
r->next=p;
r=p;
i++;
scanf("%d %d",&n,&m);
}
r->next=NULL;
}
void print(List L)
{
Node *p;
p=L->next;
if(p==NULL)
{
printf("结果为0");
return;
}
if(p->b==0) printf("%d",p->a);
if(p->b!=0)
{
if(p->a==1) printf("x^%d",p->b);
if(p->a==-1) printf("-x^%d",p->b);
if(p->a!=1&&p->a!=-1)printf("%dx^%d",p->a,p->b);
}
for(p=p->next;p!=NULL;p=p->next)
{
if(p->b==0)
{
if(p->a<0)
printf("%d",p->a);
else
printf("+%d",p->a);
}
else
{
if(p->a<0)
{
if(p->a == -1 && p->b==1) printf("-x");
else if(p->a!=-1 && p->b==1)
printf("%dx",p->a);
else if(p->a == -1 && p->b!=1)
printf("-x^%d",p->b);
else
printf("%dx^%d",p->a,p->b);
}
else
{
if(p->a==1 && p->b==1)
printf("+x");
else if(p->a!=1 && p->b==1)
printf("+%dx",p->a);
else if(p->a==1&& p->b!=1)
printf("+x^%d",p->b);
else
printf("+%dx^%d",p->a,p->b);
}
}
}
}
void add(List La,List Lb,List Lc)
{
List p,q,r,f;
int sum;
p=La->next;
q=Lb->next;
f=r=Lc;
while(p!=NULL&&q!=NULL)
{
if(p->b<q->b)
{
r=(List)malloc(sizeof(Node));
r->a=p->a;
r->b=p->b;
f->next=r;
f=r;
p=p->next;
}
else if(p->b==q->b)
{
sum = p->a+q->a;
if(sum!=0)
{
r=(List)malloc(sizeof(Node));
r->a=sum;
r->b=p->b;
f->next=r;
f=r;
p=p->next;
q=q->next;
}
else
{
p=p->next;
q=q->next;
}
}
else
{
r=(List)malloc(sizeof(Node));
r->a=q->a;
r->b=q->b;
f->next=r;
f=r;
q=q->next;
}
if(p!=NULL) r->next=p;
if(q!=NULL) r->next=q;
r->next=NULL;
}
}
void sub(List La,List Lb,List Lc)
{
List p,q,r,f;
int sum;
p=La->next;
q=Lb->next;
f=r=Lc;
while(p!=NULL&&q!=NULL)
{
if(p->b<q->b)
{
r=(List)malloc(sizeof(Node));
r->a=p->a;
r->b=p->b;
f->next=r;
f=r;
p=p->next;
}
else if(p->b==q->b)
{
sum = p->a-q->a;
if(sum!=0)
{
r=(List)malloc(sizeof(Node));
r->a=sum;
r->b=p->b;
f->next=r;
f=r;
p=p->next;
q=q->next;
}
else
{
p=p->next;
q=q->next;
}
}
else
{
r=(List)malloc(sizeof(Node));
r->a=q->a;
r->b=q->b;
f->next=r;
f=r;
q=q->next;
}
if(p!=NULL) r->next=p;
if(q!=NULL) r->next=q;
r->next=NULL;
}
}
void caclu(List L,int x)
{
int t=0;
List p=L->next;
while(p!=NULL)
{
t+=p->a*pow(x,p->b);
p=p->next;
}
printf("\n方程在%d处的解为%d",x,t);
}
int main()
{
system("color 8a");
List La,Lb,Lc;
init(&La);init(&Lb);init(&Lc);
printf("请输入第一个多项式:");
Set(La);
printf("请输入第二个多项式:");
Set(Lb);
print(La); putchar('\n'); print(Lb);
sub(La,Lb,Lc); putchar('\n'); printf("多项式相减得:"); print(Lc);
add(La,Lb,Lc); putchar('\n'); printf("多项式相加得:"); print(Lc);
printf("\n给定x值(求解第一个方程):");
int x;
scanf("%d",&x);
caclu(La,x);
}
运行截图: