1.前移法就是 while循环遍历顺序表,如果是负数,计数count++,如果是正数,前移count个单位(说明前面有count个负数)。
2.重建法就是如果是正数,count++(这里我count初始化为-1),前移到count的位置,负数不做处理。
最后通过length截断顺序表即可。
#include <stdio.h>
#define MAXSIZE 100
typedef struct{
int elem[MAXSIZE]
int last
} SeqList
void deletelist(SeqList *l,int i,int k)
int main(){
int i,k,j=0
SeqList *l
SeqList a
l=&a
scanf("%d%d",&i,&k)//输入i和k
while(scanf("%d",&l->elem[j])!=EOF)
j++//输入顺序表内容
l->last=j-1
deletelist(l,i,k)
return 0
}
扩展资料
顺序表插入元素
向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:
1、插入到顺序表的表头;
2、在表的中间位置插入元素;
3、尾随顺序表中已有元素,作为顺序表中的最后一个元素;将要插入位置元素以及后续的元素整体向后移动一个位置;将元素放到腾出来的位置上。
注意,动态数组额外申请更多物理空间使用的是 realloc 函数。并且,在实现后续元素整体后移的过程,目标位置其实是有数据的,还是 3,只是下一步新插入元素时会把旧元素直接覆盖。
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define MaxSize 50
#define len(x) sizeof(x)/sizeof(x[0])
typedef struct SqList
{
int data[MaxSize]
int length
}SqList
static SqList Create(int a[],int n)//用一个数组创建静态顺序表
static void Print(SqList L)//打印一个静态顺序表
static void ListInsert(SqList *p,int i,int e)//L的第i个位置插入e
static void ListDelete(SqList *p,int i)//删除列表第i个数据
static int LocateElem(SqList L,int e)//查找第一个值等于e的元素,返回其位序
static void Reverse(SqList *p,int left,int right)//逆置表的第left到right的元素顺序
/*递增序列折半查找等于e的元素,返回其位序*/
static int Binsearch(SqList L,int e)
int main()
{
int a[]={1,2,3,4}
SqList L=Create(a,len(a))
ListInsert(&L,2,100)
ListDelete(&L,2)
Reverse(&L,1,4)
Print(L)
printf("%d\n",Binsearch(L,2))
}
static SqList Create(int a[],int n)
{
SqList L
int i
L.length=n
for(i=0i<L.lengthi++)
L.data[i]=a[i]
return L
}
static void Print(SqList L)
{
int i
for(i=0i<L.lengthi++)
printf("%d ",L.data[i])
printf("\n")
}
static void ListInsert(SqList *p,int i,int e)
{
int j
if(i<1 || i>p->length+1)
{printf("错误范围\n")}
if(p->length>=MaxSize)
{printf("存储空间已满\n")}
for(j=p->lengthj>=ij--)
p->data[j]=p->data[j-1]
p->data[i-1]=e
p->length++
}
static void ListDelete(SqList *p,int i)
{
if(i<1 || i>p->length)
{printf("删除范围出错\n")return}
while(i<p->length)
{
p->data[i-1]=p->data[i]i++
}
p->length--
}
static int LocateElem(SqList L,int e)
{
int i
for(i=0i<L.lengthi++)
if(L.data[i]==e)
return i+1
return 0
}
static void Reverse(SqList *p,int left,int right)
{
int temp
if(left>right || left<1 || right>p->length)
{printf("错误的输入\n")return}
for(left--,right--left<rightleft++,right--)
{
temp=p->data[left]
p->data[left]=p->data[right]
p->data[right]=temp
}
}
static int Binsearch(SqList L,int e)
{
int mid,low=0,high=L.length-1
while((low+1)!=high)
{
mid=(low+high)/2
if(L.data[mid]==e) return mid+1
if(e<L.data[mid]) high=mid
if(e>L.data[mid]) low=mid
}
return 0
}
ListInsert 和 ListDelete 为你所要的函数