数据结构 实验 线性顺序表的实现与应用

数据结构

实验:线性顺序表的实现与应用

一、实验目的

1、熟练掌握线性表的顺序存储结构的设计及其基本操作的实现。

二、实验原理

1、线性表的顺序存储结构及其应用。

三、实验设备

Win系统电脑一台

四、实验过程(程序清单)

1、线性表顺序存储的基本操作及应用。

#include<stdio.h> 
#include<stdlib.h>
#define DATATYPE1 int
#define MAXSIZE 100
typedef struct {
	DATATYPE1 data[MAXSIZE];//数据成员 
	int len;//last成员存储的表长度 
}SEQUENLIST;//顺序表的结构体定义 
void init0_sequelist(SEQUENLIST &a){
	//顺序表初始化
	a.len=0;
	return; 
}
void init_sequelist(SEQUENLIST &a){//&a引用调用 
    //顺序表赋值 
	int i,j,k;
	printf("请输入顺序表元素,元素为整型,用空格分开,以-99为结束标志:"); 
	i=0;j=0;k=0;//数组下标从0记起 
	scanf("%d",&i);
	while(i!=-99){
		j++;//计数器
		a.data[k]=i;
		k++;//下标 
		scanf("%d",&i);
	}
	a.len=j;
} 
void print(SEQUENLIST &a) {
	//顺序表输出,下标从1记起 
	int i;
	for(i=0;i<=a.len-1;i++){//i<=a.last-1
		printf("%d ",a.data[i]);
	}
	printf("\n");
}
int insert(SEQUENLIST &a, DATATYPE1 x, int i){
	//1、将新元素x插到a表中指定的i位置上 
	int k;
	if(i<1 || i>a.len+1 || a.len>=MAXSIZE){
		return 0; 
	}
	else{
		for(k=a.len;k>=i;k--){
			a.data[k]=a.data[k-1];
		}
		a.data[i-1]=x;
		a.len=a.len+1;
		return 1; 
	}
}
int deletel(SEQUENLIST &a,int i){
	//2、在顺序表a中删除第i个元素 
	int k;
	if(i<1 || i>a.len || a.len==0){
		return 0;
	} 
	else{
		for(k=i;k<a.len;k++){
			a.data[k-1]=a.data[k];
		}
		a.len--;
		return 1;
	}
}
int locate(SEQUENLIST &a,DATATYPE1 x){
    //3、顺序表a中存在和给定值x相等的元素,返回该元素在表中的位置(从1算起)
    //否则返回0
    int k=0;
	for(k=0;k<a.len;k++){
		if(a.data[k]==x){
			return k+1;
		}
	}
	if(k>=a.len){
		return k;
	}
	else{
		return 0;
	}
} 
void insert_x_seqlist(SEQUENLIST &a,DATATYPE1 x){
	//4、有序插入:将新元素x插到a表中适当位置上。 
	int i,m; 
	i=a.len;
	while((i>=1) && (x<a.data[i-1]))i--;//找x所在的位置 
	for(m=a.len;m>=i+1;m--){
		a.data[m]=a.data[m-1];//移动空间 
	}
	a.data[i]=x;//插入x
	a.len++; 
}
void unite(SEQUENLIST &la,SEQUENLIST &lb){
	//5、合并:直接合并(重复数据不参与合并) 
	int i;
	for(i=1;i<=lb.len;i++){
		if(!locate(la,lb.data[i-1])){
			insert(la,lb.data[i-1],la.len+1);
		}
	}
}
void merge_sqlist(SEQUENLIST la,SEQUENLIST lb,SEQUENLIST &lc){
	//6、非递减有序合并 
	int i,j,k;
	i=j=k=1;
	while(i<=la.len && j<=lb.len){//la和lb均不空
		if(la.data[i-1]<=lb.data[j-1]){
			lc.data[k-1]=la.data[i-1];
			k++;
			i++;
		}
		else{
			lc.data[k-1]=lb.data[j-1];
			k++;
			j++;
		}
	}
	while(i<=la.len){//lb已空,la非空 
		lc.data[k-1]=la.data[i-1];
		k++;
		i++;
	}
	while(j<=lb.len){//la已空,lb非空 
		lc.data[k-1]=lb.data[j-1];
		k++;
		j++;
	}
	lc.len=k-1;//lc表长 
	return;	 
}
void polynomial_add(SEQUENLIST a,SEQUENLIST b,SEQUENLIST &c){
	//7、多项式a,b,c用顺序存储结构,0单元空闲不用//多项式相加 
	int m,n;
	int p,q,r;
	m=a.data[0];//表a非零系数项个数
	n=b.data[0];//表b非零系数项个数
	p=q=r=1;
	while(p<=2*m && q<=2*n){
		if(a.data[p]==b.data[q]){//指数相等,则系数相加 
			c.data[r+1]=a.data[p+1]+b.data[q+1];
			if(c.data[r+1]!=0){
				c.data[r]=a.data[p];
				r=r+2;
			}
			p=p+2;
			q=q+2;
		}
		else if(a.data[p]>b.data[q]){//指数不等 
			c.data[r+1]=a.data[p+1];
			c.data[r]=a.data[p];
			p=p+2;
			r=r+2; 
		}
		else{
			c.data[r+1]=b.data[q+1];//指数不等
			c.data[r]=b.data[q];
			q=q+2;
			r=r+2; 
		}
	} 
	while(p<2*m){//如果表b元素已处理,表a中还有非零系数项 要处理 
	    c.data[r]=a.data[p];
	    c.data[r+1]=a.data[p+1];
	    p=p+2;
	    r=r+2; 
    }
    while(q<2*n){//如果表a元素已处理,表b中还有非零系数项 要处理 
	    c.data[r]=b.data[q];
	    c.data[r+1]=b.data[q+1];
	    p=p+2;
	    r=r+2; 
    }
    c.data[0]=r/2;//计算表c中非零系数项的个数 
    c.len=r; 
} 

//主函数调用 
int main()
{   SEQUENLIST a,b,c;
    int i,j=1;
    int m;
    DATATYPE1 x;
    init_sequelist(a);
    print(a);
    while(j==1||j==2||j==3||j==4||j==5||j==6||j==7||j==8)
    {   printf("***************顺序表********************\n\n");
        printf("***********1、插入****************\n");
        printf("***********2、删除****************\n");
        printf("***********3、查找给定值所在的位置************\n");
        printf("***********4、(例2-1)有序插入************************\n");
        printf("***********5、(例2-2)Union合并************************\n");
        printf("***********6、(例2-3)非递减有序合并********************\n");
        printf("***********7、(例2-4)多项式相加************************\n");
        printf("***********8、退出************************\n");
        printf("****************请选择*********************\n");
        scanf("%d",&j);  getchar();
        switch(j)
        {  case 1:
        	    print(a);
                printf("请输入将要插入结点的位置:\n");		
				scanf("%d",&i);  getchar();
                printf("请输入将要插入结点的值:\n");	 
			    scanf("%d",&x);  getchar();
                insert(a,x,i);  
				printf("插入后顺序表为:\n");  
			    print(a);  
				break;
            case 2:
            	print(a);
                printf("请输入删除的位置:");
			    scanf("%d",&i);  getchar();
                deletel(a,i);
                printf("删除后的顺序表为:\n"); 
				print(a);   
				break;
            case 3:
            	print(a);
                printf("请输入要查找的值:"); 
			    scanf("%d",&x);  getchar();
                m=locate(a,x);
                // m=locate2(a,x);
                printf("找到值所在位置为:%d\n",m);
				break;
            case 4:
            	print(a);
                printf("请输入将要插入的元素内容: \n");	
				scanf("%d",&x);  getchar();
                //printf("请输入将要插入结点的值:\n");	  
				//scanf("%d",&x);  getchar();
                insert_x_seqlist(a,x);  
				printf("插入后顺序表为:\n");   
			    print(a); 
				break;
            case 5: 
                print(a);
                init_sequelist(b);
                print(b);  
			    unite(a,b);
                printf("合并后的结果为:  \n");
                print(a); 
                break;
            case 6:
            	print(a);
                init_sequelist(b);
                print(b);
                //init_sequelist(c);
                //print(&c);
                printf("归并排序的结果为:\n");
                merge_sqlist(a,b,c);
                print(c);
                break;
            case 7:
            	// 第一个先输入非零系数项个数,再依次输入指数、系数、...
				//例如 a=3x^2+2x  b=2x^2 相加后验证的结果:c=5x^2+2x
				//a表输入:2 2 3 1 2    b输入:1 2 2 
				//应得到输出结果:2 2 5 1 2 
				print(a);
                init_sequelist(b);
                print(b);
                init0_sequelist(c);
                //print(c);
                printf("多项式相加后的结果为:\n");
                polynomial_add(a,b,c);
                print(c);
                break;
            case 8:
            	printf("结束并退出");
                exit(0); 
			    break;
        }
    }
}

五、实验结果

六、实验心得

1、掌握线性表的顺序存储结构及其基本操作的实现。

2、学习了非递减有序合并和多项式相加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值