数据结构(寒假小结)——2.1线性表之顺序表

本文详细介绍了顺序表的基本定义、基本运算,包括插入、删除和定位操作,并通过经典案例展示了如何计算两个集合的并集。同时,提供了代码实现,帮助读者深入理解顺序表的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、本节学习要点:

  • (1).基本定义
  • (2).基本运算
  • (3).经典案例:A与B的并集

.2、基本定义:

3、基本运算:

#include<iostream.h>
typedef int datatype;//结点的数据类型,假设为int
const int maxsize=100;//最大表长度,假设为100
typedef struct {
   datatype data[maxsize]; //第一个结点是data[0]
   int n;				 //当前长度
} sqlist;				 //顺序表类型


//将x插入到顺序表L的第i个位置上
int insert(sqlist *L,datatype x,int i){
   int j;
  if(L->n==maxsize)
  {cout<<"表满,不能插入!(上溢)\n";return 1;}
  if(i<1 || i>L->n+1)
    {cout<<"非法插入位置!\n";return 0;}	
  for(j=L->n;j>=i;j--) 
    L->data[j]=L->data[j-1];   	 //结点后移
  L->data[i-1]=x;              //插入x,第i个结点的数组下标是i-1
  L->n++;				    	//修改表长
  return 1;				      //插入成功
}

//从顺序表中删除第i个位置上的结点
int deletes(sqlist *L,int i){
  int j;
  if(L->n==0)
    {cout<<"表空,不能删除!(下溢)\n";return 1;}
  if(i<1 || i>L->n)
    {cout<<"非法删除位置!\n";return 0;}
  for(j=i+1;j<=L->n;j++)
    L->data[j-2]=L->data[j-1];	//结点前移
  L->n--;					//修改表长
  return 1;				//删除成功
}

//从顺序表中定位数据
int locate(sqlist *L,datatype x) {
   int i;
   i=1;
   while(i<=L->n && L->data[i-1]!=x) i++;
   if(i<=L->n) return i;	//找到
   else return 0;		//未找到
}

//输出顺序表
void print(sqlist *L){
	cout<<"The sqlist is: "<<endl;
	for(int i=0;i<L->n;i++){
		cout<<L->data[i]<<" ";
	}
	cout<<endl;
}

void main(){
    int d[10]={1,1,2,3,4,7,8,9,6,5};//数据源,当然也可以通过输入,这里不写了
	sqlist *L=new sqlist;//实例化sqlist类型
	L->n=10;
	//顺序表中的字符初始化
	for(int i=0;i<10;i++){
		L->data[i]=d[i];
	}
	cout<<"Before insert..."<<endl;
	print(L);
	//调用插入
    cout<<"After insert..."<<endl;
	insert(L,17,5);
	print(L);
	//调用删除
//  deletes(L,2);
	//调用定位
  //  locate(L,2)

}

4、经典案例:A与B的并集:

#include<iostream.h>
typedef int datatype;    //线性表结点的数据类型
const int maxsize=100;   //线性表可能的最大长度,假设为100

//每个线性表都是一个struct类型的结点(声明为sqlist类型),这个struct类型结构如下:

struct sqlist{               //  也就是说,每个线性表都是sqlist类型,这个sqlist类型是用户自定义的结构类型,跟int一样可以用来说明变量
    datatype data[maxsize];  //  线性表的内容存放在一个data数组当中
    int n;                   //  线性表的长度用变量n来记录
};

//定位操作
int locate(sqlist *L,datatype x) {
   int i;
   i=1;
   while(i<=L->n && L->data[i-1]!=x) i++;
   if(i<=L->n) return i;    //找到
   else return 0;        //未找到
}

//求集合交集
void intersection(sqlist *A,sqlist *B) { 
    int m,n,i,k,s=0;
    datatype x;
    for(i=0;i<A->n;i++) {
        x=A->data[i];        //在A中取一元素
        k=locate(B,x);        //在B中查找它    
        if(k==0) s++;  //k==0表示未在B中找到该元素
        else if(s>0) A->data[i-s]=A->data[i]; 
    }
    A->n=A->n-s;    
}
//输出顺序表
void print1(sqlist *L){
    cout<<"The sqlist is: "<<endl;
    for(int i=0;i<L->n;i++){
        cout<<L->data[i]<<" ";
    }
    cout<<endl;
}

int main(){
    sqlist *sq1=new sqlist;  //为sq1开辟内存空间,如果缺少new,则sq1未被初始化!
    sqlist *sq2=new sqlist;
    int n1,n2,i,position;
    cout<<"How many elements of the sqlist 1?"<<endl;
    cin>>n1;
    sq1->n=n1;
    cout<<"Input the "<<n1<<" elements of the sqlist 1:"<<endl;
    for(i=0;i<n1;i++){
        cin>>sq1->data[i];
    }
    cout<<"How many elements of the sqlist 2?"<<endl;
    cin>>n2;
    sq2->n=n2;
    cout<<"Input the "<<n2<<" elements of the sqlist 2:"<<endl;
    for(i=0;i<n2;i++){
        cin>>sq2->data[i];
    }
    intersection(sq1,sq2);
    print1(sq1);
    return 0;
}

如果有错误请大家指出,共同学习共同进步!更多百度百科奋斗奋斗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值