C语言数据结构实验——线性表及其应用

题目如下:(共三小题)

题目一:

       顺序表:编写一个程序,其功能是:在一个非递减的顺序表中,删除所有值相等的多余元素,并输出删除前后的元素。要求时间复杂度为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);
}

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值