初学学习算法及数据结构记录(1)——顺序表

还有许多要改进的地方,只是作为学习记录

两个顺序表集合的差集

测试数据: 

25 33 57 60 48 9 13 0

12 50 23 60 4 34 25 13 0

#include <iostream>
#include <stdlib.h>
#define SIZE 25000 
using namespace std;
typedef struct First{
	int *first_num;//声明动态数组 
	int first_len;//记录顺序表长度 
	int first_size;//记录顺序表分配储存容量 
}first;
typedef struct Second{
	int *second_num;//声明动态数组 
	int second_len;//记录顺序表长度 
	int second_size;//记录顺序表分配储存容量 
}second;

//初始化顺序表
first initFirst () {
	first f1;
	f1.first_num = (int*)malloc(SIZE * sizeof(int));//申请动态内存空间 ***这里出了错误有疑问,为什么first->first_num这样访问不正确 
    if(!f1.first_num){
    	cout<<"初始化失败"<<endl;
		exit(0); 
	}//应对初始化失败 
	f1.first_len=0;
	f1.first_size=SIZE;
	return f1;
} 
second initSecond () {
	second s1;
	s1.second_num= (int*)malloc(SIZE * sizeof(int));//申请动态内存空间 
    if(!s1.second_num){
    	cout<<"初始化失败"<<endl;
		exit(0); 
	}//应对初始化失败 
	s1.second_len=0;
	s1.second_size=SIZE;
	return s1; 
} 
//顺序表的输出
void display(first f1){
	for(int i=0; i <= f1.first_len; i++){
		cout<<f1.first_num[i]<<" ";
	}
	cout<<"\n"<<endl;
}
//查找函数
int select(first f1,int second){
	int pos=0;//判断是否重合 
	int sit=0;//记录重合的数的位置 
	//需为<=否则无法舍去0 
	for(int i=0; i<=f1.first_len; i++){
		if(f1.first_num[i]==second){
			pos++;
			sit=i;
		}
	}
	if(pos==0){
		pos=0;
		return -1;
	}
	else return sit;
}
//删除重合的元素
first del(first f1,int sit){
	if(sit>f1.first_len||sit<0){
		cout<<"位置有误"<<endl;
		exit(0); 
	}
	//删除元素 
	for(int i=sit; i<=f1.first_len; i++){
		f1.first_num[i]=f1.first_num[i+1];//从后向前移 
	} 
	f1.first_len--;//数据少一 
	return f1;//返回原数列 
}
//主函数加入数组
int main(){
	int i=0,j=0;
	int X,Y;//记录数字 
	int position=0;//记录重合位置 
	//分别分配动态内存
	first f1=initFirst();
	second s1=initSecond(); 
	//分别输入两组数字 ,条件中输入直接判定为1 
	while(cin>>X){ 
		if(X==0) break;
		 f1.first_num[i]=X;
		i++;
		f1.first_len++;
	}
	/*	while(f1.first_num[i-1]!=0){ 
		cin>>f1.first_num[i];
		i++;
		f1.first_len++;
	}出现输入输出不匹配的情况**不能是以上情况,应学习把语句作为真值*/
	while(cin>>Y){
		if(Y==0) break;//跳出当前循环 
		 s1.second_num[j]=Y;
		j++;
		s1.second_len++;
	}
	//进入查找元素,查找第一组元素中与第二组重合的元素 
		for(j=0; j<=s1.second_len;j++) {
			position=select(f1,s1.second_num[j]);
			if(position>=0)
		    f1=del(f1,position);
		}
		display(f1);
		//归还内存 
		free(f1.first_num);
		free(s1.second_num);
   return 0;	
} 

访问内存问题已经解决,指针变量访问结构体内部成员用->,普通变量则用‘ .’

在数据的输入上出现了问题,用注释内的写法,输入与输出数据对应的下标应该是不匹配的

希望有大佬可以解释为什么输入方式错误,但数据测试是对的:(

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值