数据结构第一次作业(7.31)(第十次作业)

按位置增删改查:

#include <stdio.h>
#include <stdlib.h>

#define  N  10

typedef struct {
	int arr[N];
	int pos;
} User;

User* creat_arr(void);
void  add_arr(User*);
void  print_arr(User*);
void  remove_arr(User*);
void  change_arr(User*);
void  find_arr(User*);

int main(int argc, const char *argv[])
{	
	User* u = creat_arr();
	int b=1;
	while(b==1){
		printf("请选择你想要执行的操作!\n");
		printf("0:退出\n1:在顺序表末尾添加一个元素\n2:删除末尾的一个元素\n3:修改末尾的一个元素\n4:查找某一下标的数据\n5:遍历顺序表\n");
		int a=0;
		scanf("%d",&a);
		switch(a){
		case 1:{
				   add_arr(u);
				   break;
			   }
		case 2:{
				   remove_arr(u);
				   break;
			   }                  
		case 3:{
				   change_arr(u);
				   break;
			   }                  
		case 4:{
				   find_arr(u);
				   break;
			   }
		case 5:{
				   print_arr(u);
				   break;
			   }
		case 0:{
				   b=0;break;
			   }
		}
	}
	return 0;
}

//创建
User* creat_arr(void){
	User *s = (User*) malloc(sizeof(User));
	if(NULL==s)
		return NULL;
	s->pos=0;
	//内存置位,全部置零
	//memset(s,0,sizeof(s));
	return s;
}

//增加
void add_arr(User* u){
	if(10<=u->pos){
		printf("该顺序表已装满!pos值为:%d\n",u->pos);
		return ;
	}
	printf("当前下标为:%d,请输入您想填入的数据!\n",u->pos);
	scanf("%d",&u->arr[u->pos++]);
}

//删除
void remove_arr(User* u){
	if(0==u->pos){
		printf("当前顺序表为空,操作失败!\n");
		return ;
	}
	int rm = u->arr[--u->pos];
	u->arr[u->pos]=0;//可以不改为0,因为下次增加数据还是会被覆盖
	printf("删除元素为:%d,当前下标为:%d,值为:%d\n",rm,u->pos,u->arr[u->pos]);
}

//修改
void change_arr(User* u){
	if(10<u->pos||u->pos<=0){
		printf("修改失败,pos指向有误!\n");
		return ;
	}
	int ch=u->arr[u->pos-1];
	scanf("%d",&u->arr[u->pos-1]);
	printf("修改前的数据为:%d,修改后的数据为:%d\n",ch,u->arr[u->pos-1]);
}

//查找
void find_arr(User* u){
label:
	printf("请输入要查找数据的下标!大于等于0小于%d\n",u->pos);
	int num=0;
	scanf("%d",&num);
	if(num>=u->pos||num<0){
		printf("输入下标有误!\n");
		goto label;
	}
	printf("当前下标的数据为:%d\n",u->arr[num]);
}

//打印
void print_arr(User* u){
	printf("开始遍历顺序表!\n");
	if(u->pos==0){
		printf("当前顺序表为空\n");
		return;
	}
	for(int i=0;i<u->pos;i++)
		printf("当前下标为%d,存储内容为:%d\n",i,u->arr[i]);
}

按数据增删改查

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  N  10

typedef struct {
	int arr[N];
	int pos;
} User;

User* creat_arr(void);
void  print_arr(User*);
void  remove_arr(User*,int);
void  change_arr(User*,int);
int*  find_arr(User*,int);
void  insert_arr(User*);

int main(int argc, const char *argv[])
{	
	User* u = creat_arr();
	u->arr[0]=9;
	u->arr[1]=7;
	u->arr[2]=3;
	u->arr[3]=9;
	u->arr[4]=3;
	u->arr[5]=9;
	u->pos = 6;


	if(u==NULL)
		return 0;
	int b=1,num=0;
	while(b==1){
		printf("请选择你想要执行的操作!\n");
		printf("0:退出\n1:在顺序表指定位置添加一个元素\n2:删除表中指定的数据\n3:修改表中指定的数据\n4:查找某个数据的下标\n5:遍历顺序表\n");
		int a=0;
		scanf("%d",&a);
		switch(a){
		case 1:{
				   insert_arr(u);
				   break;
			   }
		case 2:{
				   printf("请输入要删除的数据!\n");
				   scanf("%d",&num);
				   remove_arr(u,num);
				   break;
			   }                  
		case 3:{
				   printf("请输入要修改的数据!\n");
				   scanf("%d",&num);
				   change_arr(u,num);
				   break;
			   }                  
		case 4:{
				   printf("请输入要查找的数据!\n");
				   scanf("%d",&num);
				   int *a = find_arr(u,num);
				   if(*a==-1){
					   printf("查无此数\n");
					   break;}
				   printf("该数据在数组中的下标为:");
				   for(int i=0;*(a+i)!=-1;i++)
					   printf("%-3d",*(a+i));
				   putchar(10);
				   break;
			   }
		case 5:{
				   print_arr(u);
				   break;
			   }
		case 0:{
				   b=0;break;
			   }
		}
		printf("-----------------------------------------\n");
	}
	free(u);
	return 0;
}

//创建
User* creat_arr(void){
	User *s = (User*) malloc(sizeof(User));
	if(NULL==s)
		return NULL;
	s->pos=0;
	//内存置位,全部置零
	//memset(s,0,sizeof(s));
	return s;
}

//按位置插入
void insert_arr(User* u){
	if(10<=u->pos){
		printf("该顺序表已满!\n");
		return;
	}
label2:
	printf("请输入想要插入的位置(0~%d)和数据,空格隔开!\n",N-1);
	int place=0,data=0;
	scanf("%d %d",&place,&data);
	if(place>=N||place<0){
		printf("插入位置不合法!\n");
		goto label2;
	}
	place>u->pos ? place=u->pos : place;
	for(int i=u->pos;i!=place;i--)
		u->arr[i]=u->arr[i-1];
	u->arr[place]=data;
	u->pos++;
}

//按照数据删除
void remove_arr(User* u,int num){
	int *a = find_arr(u,num),i=0;
	if(*a==-1){
		printf("该顺序表中没有%d这个数据\n",num);
		return;
	}
	for(;*(a+i)!=-1;i++)
		for(int j=*(a+i);*(a+i+1)!=-1?j<*(a+i+1)-1:j<u->pos;j++){
			u->arr[j-i]=u->arr[j+1];
		}
	u->pos-=i;
}


//按照数据修改
void change_arr(User* u,int num){
	int *a=find_arr(u,num);
	if(*a==-1){
		printf("该顺序表中没有%d这个数据\n",num);
		return;
	}
	printf("请输入修改后的数据\n");
	int chnum ;
	scanf("%d",&chnum);
	for(int i=0;*(a+i)!=-1;i++)
		u->arr[*(a+i)]=chnum;
}


//按照数据查找
int* find_arr(User* u,int num){
	int j=0;
	static int arr2[N+1];
	memset(arr2,-1,sizeof(arr2));
	for(int i=0;i<u->pos;i++)
		if(u->arr[i]==num){
			arr2[j++]=i;
		}
	return arr2;
}


//打印
void print_arr(User* u){
	printf("开始遍历顺序表!\n");
	if(u->pos==0){
		printf("当前顺序表无数据!\n");
		return;
	}
	for(int i=0;i<u->pos;i++)
		printf("当前下标为%d,存储内容为:%d\n",i,u->arr[i]);
}

#include <stdio.h>
#include <stdlib.h>

#define  N  31

typedef struct {
	int arr[N];
	int pos;
} List;

List* creat_arr(void);
void  print_arr(List*);
void remove_arr(List*,int);
void quchong(List*);

int main(int argc, const char *argv[])
{	
	List* l = creat_arr();
	int arr2[31]={1,2,2,1,1,3,4,3,2,4,5,3,4,5,4,1,1,2,2,1,3,4,3,2,4,5,3,4,5,4,1};
	for(int i=0;i<31;i++)
		l->arr[i]=arr2[i];
	l->pos+=31;
	print_arr(l);
	quchong(l);
	print_arr(l);
	return 0;
}

//创建
List* creat_arr(void){
	List *s = (List*) malloc(sizeof(List));
	if(NULL==s)
		return NULL;
	s->pos=0;
	//内存置位,全部置零
	//memset(s,0,sizeof(s));
	return s;
}
//按位置删除
void remove_arr(List *l,int num){
    if(0==l->pos){
        printf("该顺序表为空!!\n");
        return;
    }
    if(num>=N||num<0){
        printf("删除位置不合法!\n");
        return;
    }
    for(int i=num;i<l->pos-1;i++)
        l->arr[i]=l->arr[i+1];
    l->pos--;                                                               
}
//去掉重复数据
void quchong(List *l){
	for(int i=0;i<l->pos;i++)
		for(int j=i+1;j<l->pos;j++)
			if(l->arr[i]==l->arr[j]){
				remove_arr(l,j);
				j--;
			}
}

//打印
void print_arr(List* l){
	printf("开始遍历顺序表!\n");
	if(l->pos==0){
		printf("当前顺序表为空\n");
		return;
	}
	for(int i=0;i<l->pos;i++)
		printf("当前下标为%-2d,存储内容为:%d\n",i,l->arr[i]);
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值