问题:
顺序表的查找以及修改,跟数组一样,直接进行遍历查找,以及直接找到数组中某个值
思路:
- 查找——目的时找到对应值的数组下标
- 输入所需数组,所需查找的值。对顺序表中数组进行遍历,若找到,则返回下标即可。
- 输入你想删除的值,然后实现删除操作。
- 流程——1.先输入所需删除的值。2.再用查找,找到其下标。3.若返回的下标合法,则进行删除操作。
printf("你想删除哪个数\n");
int num;
scanf("%d",&num);
int n = sqfind(&s,num);
if(n != -1)
{
sqpop(&s,n);
sqprintf(&s);
}
else
printf("找不到你说的这个数啊,老铁\n");
- 若想删除所有一样的数,若删除所有的2,只需循环,之后再查找即可。
printf("你想删除哪个数\n");
int t;
scanf("%d",&t);
int pos = sqfind(&s,t);
while(pos != -1)
{
sqpop(&s,pos);
pos = sqfind(&s,t);
sqprintf(&s);
}
-
修改,一样的操作,先给修改函数写好。只需给该下标处的值,赋值,进行覆盖即可。
printf("你想修改哪个数\n");
int shu;
scanf("%d",&shu);
int q = sqfind(&s,shu);
if(q != -1)
{
printf("修改成什么\n");
int num01;
scanf("%d",&num01);
sqmodify(&s,q,num01);
sqprintf(&s);
}
else
printf("找不到你说的这个数啊,老铁\n");
-
下面是所有代码总结。包含前面顺序表的定义,初始化,打印,检查,插入和删除
代码如下:
#include <stdio.h>
#include <stdlib.h>
//定义顺序表
typedef int sqdatatype;
typedef struct sllist
{
sqdatatype *a;
int size;
int capacity;
}sl;
//初始化顺序表
void sqinint(sl *s)
{
s->a=NULL;
s->capacity=0;
s->size=0;
}
//打印顺序表
void sqprintf(sl *s)
{
int i;
for(i=0;i<s->size;i++)
{
printf("%d ",s->a[i]);
}
printf("当前容量为%d\n",s->capacity);
}
//检查顺序表为空或满,不满足,则扩容
void sqcheck(sl *s)
{
if(s->capacity==s->size)
{
int newcapacity= s->capacity == 0 ? 4 : s->capacity * 2;
sqdatatype *temp=(sqdatatype*)realloc(s->a,sizeof(sqdatatype)*newcapacity);
if(temp==NULL)
{
printf("扩容失败\n");
// exit(-1);
}
s->a=temp;
s->capacity=newcapacity;
}
}
//插入某个位置
void sqpush(sl *s,int i,int w)//这里的i插入的位置为数组下标
{
if(i<0 || i>s->size)
{
printf("插入位置不合法\n");
// exit(-1);
}
sqcheck(s);
int end =s->size-1;
while(end >= i )
{
s->a[end+1]=s->a[end];
end--;
}
s->a[i]=w;
s->size++;
}
//删除某个位置
void sqpop(sl *s,int i)
{
if(i<0 || i>=s->size)
{
printf("删除位置不合法\n");
// exit(-1);
}
sqcheck(s);
int begin = i;
while(begin < s->size-1)
{
s->a[begin]=s->a[begin+1];
begin++;
}
s->size--;
}
//头插法插入
void sqhead(sl *s,int w)
{
sqpush(s,0,w);//所传的位置值,都为数组下标;
}
//尾插法插入
void sqrear(sl *s,int w)
{
sqpush(s,s->size,w);
}
//查找数值——所处下标并返回
int sqfind(sl *s,int n)
{
if(s==NULL)
printf("该顺序表无效\n");
int i;
for(i=0;i<s->size;i++)
{
if(s->a[i]==n)
return i;
}
return -1;
}
void sqmodify(sl *s,int i,int w)
{
if(s==NULL)
{
printf("修改时,顺序表不存在\n");
}
s->a[i]=w;
}
int main()
{
sl s;
sqinint(&s);
sqhead(&s,5);
sqhead(&s,2);
sqhead(&s,2);
sqhead(&s,2);
sqhead(&s,5);
sqprintf(&s);
sqpush(&s,1,5000);
sqprintf(&s);
sqpop(&s,1);
sqprintf(&s);
/*printf("你想删除哪个数\n");
int num;
scanf("%d",&num);
int n = sqfind(&s,num);
if(n != -1)
{
sqpop(&s,n);
sqprintf(&s);
}
else
printf("找不到你说的这个数啊,老铁\n");
*/
//若想删除所有的2
printf("你想删除哪个数\n");
int t;
scanf("%d",&t);
int pos = sqfind(&s,t);
while(pos != -1)
{
sqpop(&s,pos);
pos = sqfind(&s,t);
sqprintf(&s);
}
printf("你想修改哪个数\n");
int shu;
scanf("%d",&shu);
int q = sqfind(&s,shu);
if(q != -1)
{
printf("修改成什么\n");
int num01;
scanf("%d",&num01);
sqmodify(&s,q,num01);
sqprintf(&s);
}
else
printf("找不到你说的这个数啊,老铁\n");
return 0;
}