顺序表操作

顺序表操作

什么是顺序表

顺序表示线性表的顺序存储结构,即按顺序存储方式构造的线性表的存储结构。
对于有n个元素的顺序表A,可以表示为A[0…n-1],其下标从0到n-1,A[0]称为第1个元素,A[1]称为第2个元素,…A[n-1]称为第n个元素。

顺序表的存储结构

 #define MaxLen 50
         typedef  int elemtype;  //定义elemtype为int类型
         typedef  elemtype sqlist[MaxLen];

顺序表的创建、显示

#include<stdio.h>
#define Maxlen 20
typedef int elemtype;
typedef elemtype sqlist[Maxlen];

int create(sqlist A)
{
	int i,n;
	printf("创建一个顺序表:\n");
	printf("输入元素个数:");
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		printf("输入第%d个元素:",i+1);
		scanf("%d",&A[i]);
	 } 
	 return n;
 } 
void display(sqlist A,int n)
 {
 	int i;
 	printf("输出一个顺序表:"); 
 	if(n==0){
 		printf("\n空表");
 		return;
	 }
	 for(i=0;i<n;i++)
	 {
	 	printf("%4d",A[i]);
	 }
	 printf("\n");
 }

顺序表的插入

(以下程序都需要用到顺序表的创建、显示。#include "sqlist.cpp"是将顺序表的创建、显示存为sqlist.cpp文件,然后被调用。)
已知一个顺序表A中的元素按值非递减有序,编写一个函数,插入一个元素x后保持该顺序表是有序的。

#include "sqlist.cpp"
int Insert(sqlist A,int n)
{
	int m=n;
	int s;
	int j=0;
	printf("请输入插入元素:"); 
	scanf("%d",&s);
	while(j<1){
		if(A[n-1]<s)
		{
			A[n]=s;
			j--;
		}
		else{
			A[n]=A[n-1];
			n--;
		}
	}
	n=m+1;
}
int main()
{
	sqlist A;
	int n;
	n=create(A);
	display(A,n);
	n=Insert(A,n);
	display(A,n);
}

顺序表的删除

设A为顺序表,试编写删除A中第i个元素起的k个元素的算法。

#include "sqlist.cpp"
int Delete(sqlist A,int n)
{
	int j,k,i;
	printf("请输入删除的位置j:");
	scanf("%d",&j);
	printf("请输入删除的个数k:"); 
	scanf("%d",&k);
	for(i=0;i<=n-k;i++)
	{
		A[j-1]=A[j+k-1];
		j++;
	} 
	n=n-k;
	return n;
}
int main()
{
	sqlist A;
	int n;
	n=create(A);
	display(A,n);
	n=Delete(A,n);
	display(A,n);
}

顺序表的合并

编写一个算法,将m(m>2)个有序(从小到大)顺序表合并成一个有序顺序表。合并过程不另设新的顺序表存储。

#include"sqlist.cpp"
int comb(sqlist A,int na,sqlist B,int nb)
{
	int n=na,m=nb;
	if(na+nb > Maxlen) return 0; //顺序表上溢
	while(nb>0)
	{
		if((na==0)||(A[na-1]<B[nb-1]))
		{ //说明B[nb-1]是第na+nb大的元素 
			A[na+nb-1] = B[nb-1];
			nb--;
		}
		else
		{
			A[na+nb-1] = A[na-1]; //说明A[na-1]是第na+nb大的元素 
			na--;
		}
    }
    na = n + m;
    return na;
}
int main(){
	sqlist A,B;
	int m; 
	printf("请输入顺序表个数:");
	scanf("%d",&m);
	int na,nb;
	na = create(A);
	display(A,na);
	for(int i=1;i<m;i++)
	{
	nb = create(B);
	na = comb(A,na,B,nb);
	display(B,nb);
	}
	display(A,na);
}

顺序表的排列

设A和B是两个顺序表,其元素按从小到大的顺序排列。编写一个将A和B中所有元素组成一个新的从小到大的有序顺序表C的算法,要求删除重复的元素。

#include"sqlist.cpp"
int comb(sqlist A,int na,sqlist B,int nb)
{
	sqlist C;
	int n=na,m=nb;
	int temp;
	if(na+nb > Maxlen) return 0; //顺序表上溢
	while(nb>0)
	{
		if((na==0)||(A[na-1]<B[nb-1])){ //说明B[nb-1]是第na+nb大的元素 
			A[na+nb-1] = B[nb-1];
			nb--;
		}
		else{
			A[na+nb-1] = A[na-1]; //说明A[na-1]是第na+nb大的元素 
			na--;
		}
    }
    na = n + m;
    for(int i=0;i<na;i++)
    {
    	C[i]=A[i];
    	if(A[i]==A[i+1])
    	{
    		for(int j=i;j<=na-i;j++)
    		{
    		A[j+1]=A[j+2];	
			}
		    na--;
		}
	}
 for(int i=0;i<na;i++){
 	A[i]=C[i];
 }
    return na;
}
int main(){
	sqlist A,B;
	int na,nb;
	na = create(A);
	display(A,na);
	nb = create(B);
	display(B,nb);
	na = comb(A,na,B,nb);
	display(A,na);
}

顺序表的逆序

设有一个顺序表A,包含n个元素,要求写出一个将该表逆置的算法,并只允许在原表的存储空间外再增加一个附加的工作单元。

#include"sqlist.cpp"
void invert(sqlist A,int n){
	int m=n/2;
	int temp=0;
	for(int i=0;i<m;i++){
		temp=A[i];
		A[i]=A[n-i-1];
		A[n-i-1]=temp;
	}
}
int main(){
	sqlist A;
	int n;
	n = create(A);
	display(A,n);
	invert(A,n);
	display(A,n);
	return 0;
}

顺序表的调整

已知数组A[0…n-1]的元素类型为整型,设计算法调整A,使其左边的所有元素小于0,右边的所有元素大于等于0(要求算法的时间复杂度和空间复杂度均为O(n))

#include<stdio.h>
#include"sqlist.cpp"
void adjust(sqlist A,int n)  //调整A 
{
   sqlist B;
   int i,x=0,y=n-1;
   for(i=0;i<n;i++)
   {
   	  if(A[i] < 0) {
   	  	B[x] = A[i];
   	  	x++;
	  }else{
	  	B[y] = A[i];
	  	y--;
	  }
	}	
	for(i=0;i<n;i++){
		A[i] = B[i];
	}
} 
int main()
{
	sqlist A;
	int n;
	n = create(A);
	display(A,n);
	adjust(A,n);
	display(A,n); 
	return 0;
}
上一篇:java学习(162):同步对象锁


下一篇:task3a_gmt函数