顺序表的操作集合

包括对线性表的插入,删除,销毁,排序,交换等等操作

#define MULTIPLE 2
#define ERROR -1
typedef int elem_type;

#define INIT_SIZE 10

typedef struct _DSEQ_LIST
{
elem_type *data;
int length;
int total_length;
}Dlist;


#include<stdio.h>

#include<stdlib.h>
#include<assert.h>
#include"list_des.h"


Dlist *init_dse_list()
{
Dlist *phead = (Dlist *)malloc(sizeof(Dlist));
elem_type *p = (elem_type *)malloc(sizeof(elem_type)*INIT_SIZE);
assert(phead != NULL && p != NULL);


phead->data = p;
phead->length = 0;
phead->total_length = INIT_SIZE;
return phead;
}


bool destory_dse_list(Dlist *p)
{
if (p == NULL)    //研究将其写成宏函数形式
{
return false;
}


free(p->data);
free(p);
return true;
}


//其存在的意义,1,调用函数增加开销,2,直接通过结构体指针就能直接找到
//对不属于自己的进行操作使得程序崩溃
//保护数据,防止对其意外修改


bool clear_seq_list(Dlist *p)
{
if (p == NULL)
{
return false;
}


for(int i=0; i<get_length(p); i++)
{
*(p->data+i) = 0;
}
p->length = 0;


return true;
}


bool insert(Dlist *p, int pos, elem_type e)
{
if (p == NULL || pos>get_length(p) || !is_full(p))
{
return false;
}
for (int i=get_length(p)+1; i>=pos; i--) //向后挪动
{
*(p->data + i+1) = *(p->data + i);
}

*(p->data+pos) = e;
p->length++;


return true;
}


bool insert_head_majia(Dlist *p, elem_type e)
{
return insert(p,0,e);
}


bool insert_tail_majia(Dlist *p, elem_type e)
{
return insert(p,get_length(p),e);
}


bool insert_tail(Dlist *p, elem_type e)
{
    if(p == NULL)
{
return false;
}
if (false == is_full(p))
{
return false;
}


*(p->data + p->length) = e;
p->length++;
return true;
}


bool insert_head(Dlist *p, elem_type e)
{
if(p == NULL)
{
return false;
}
if (false == is_full(p))
{
return false;
}




if (p->length != 0)
{
for(int i=p->length; i>0; i--)
      {
*(p->data+i) = *(p->data+i-1);
   }
}
*(p->data) = e;
p->length++;


return true;
}


bool is_full(Dlist *p)
{
if (p == NULL)
{
return false;
}


if (get_length(p) == p->total_length) //从零开始,第九个的时候已经满了,p->length = 10;
{
//elem_type *data             void *realloc( void *memblock, size_t size );
//p->data = (elem_type *)realloc(p->data, (p->total_length) * MULTIPLE);
p->data = (elem_type *) realloc(p->data, (p->total_length) * MULTIPLE*sizeof(elem_type));
assert(p->data != NULL);
p->total_length = MULTIPLE * (p->total_length);
}


return true;
}


bool is_empty(Dlist *p)
{
if (!(p != NULL && p->length == 0)) //
{
return false;
}
return true;
}


bool show(Dlist *p, void (*pfunc)(elem_type *))
{
if (p == NULL)
{
return false;
}
          //此处的p已经经过检查,可以直接采用p->length形式,这样写避免函数的使用的代价
for(int i=0; i<get_length(p); i++)
{
pfunc(p->data+i);
}
return true;
}


bool get_pos_by_value(Dlist *p, elem_type e,int *n)
{
while (p == NULL)
{
return false;
}


int i = 0;
while (i < p->length)
{
if (*(p->data+i)==e)
{
*n = i;
return true;
}
i++;
}
return false;
}


bool search_yes_or_no(Dlist *p, elem_type e)
{
int n=0;
bool x =get_pos_by_value(p,e,&n);


if (!x)
    {
return false;
}


return true;
}


bool sort(Dlist *p)
{
if (p == NULL)
{
return false;
}
for(int i=0; i<p->length; i++)
{
for(int j=0; j<p->length-i-1; j++)
{
if (*(p->data+j) > *(p->data+j+1))
{
elem_type temp = 0;
temp = *(p->data+j);
*(p->data+j) = *(p->data+j+1);
*(p->data+j+1) =temp;
}
}
}
return true;
}


bool get_max(Dlist *p, elem_type *e)
{
if (p == NULL)
{
return false;
}


int max = *p->data;
for(int i=1; i<get_length(p); i++)
{
if (*(p->data+i)>max)
{
max = *(p->data+i);
}
}
*e = max;
return true;
}


bool get_min(Dlist *p, elem_type *e)
{
if (p == NULL)
{
return false;
}


int min = *p->data;
for(int i=1; i<get_length(p); i++)
{
if (*(p->data+i)<min)
{
min = *(p->data+i);
}
}
*e = min;
return true;
}


int get_length(Dlist *p)
{
if (p == NULL)
{
return ERROR;
}
return p->length;
}


bool del_head_majia(Dlist *p, elem_type *e)
{
return del(p, 0, e);
}


bool del_tail_majia(Dlist *p, elem_type *e)
{
return del(p, get_length(p), e);
}


bool del_head(Dlist *p, elem_type *e)
{
if (p == NULL)
{
return false;
}


*e = *p->data;
for (int i=0; i<get_length(p); i++)
{
*(p->data+i) = *(p->data+i+1);
}
p->length--;


return true;
}


bool del_tail(Dlist *p, elem_type *e)
{
if (p == NULL)
{
return false;
}


*e = *(p->data+get_length(p)-1);
    p->length--;
return true;
}


bool del(Dlist *p,int pos, elem_type *e)
{
if (p == NULL) //get_length中包含对p为空的判断
{
return false;
}
if (pos > get_length(p))
{
return false;
}


*e = *(p->data+pos);
for(int i=pos; i<get_length(p); i++)
{
*(p->data+i) = *(p->data+i+1);
}
p->length--;


return true;
}


bool put(Dlist *p, int pos, elem_type e)
{
if (!(p != NULL && pos < get_length(p)))
{
return false;
}


*(p->data + pos)=e;  //让其下标皆从零开始
return true;
}


bool get(Dlist *p, int pos, elem_type *e)
{
if (!(p != NULL && pos < get_length(p)))
{
return false;
}
*e = *(p->data+pos);
return true;
}


bool meger(Dlist *p, Dlist *s)//p=p+s;
{
if (p == NULL || s == NULL)
{
return false;
}


elem_type temp;//如果当其为整型进行初始化,那如果是结构体就用不了
for (int i=0; i<get_length(s); i++)
{
bool bo = get(s, i, &temp);
if (bo == false)
{
return false;

}
insert_tail(p, temp);
}


return false;
}








bool swap(Dlist *p, Dlist *s)
{
if (p == NULL || s == NULL)
{
return false;
}


int i = 0;
int x = get_length(p);
int y = get_length(s);


int plength = x;
int slength = y;


while(x>0 && y>0)
{
is_full(s);
is_full(p);


elem_type temp1;
elem_type temp2;
bool s1 = get(p, i, &temp1);
bool s2 = get(s, i, &temp2);


if (s1 == false || s2 ==false)
{
return false;
}
//如果将两个判断合并起来,则在拿出放进之后,如果得到的就是错误的数据,已经放进去再退出这个函数,对数据有污染
bool s3 = put(s, i, temp1);
bool s4 = put(p, i, temp2);


if (s3 == false || s4 == false)
{
return false;
}


x--;
y--;
i++;
}


elem_type temp;
if (x == 0)
{  
    while (y-- != 0)
{
get(s, i, &temp);
insert(p,i,temp);
i++;
}
}
else
{
while (x-- != 0)
{
get(p, i, &temp);
insert(s, i, temp);
i++;
}
}


p->length = slength;
s->length = plength;
return true;
}


bool merger_by_order(Dlist *p, Dlist *s)//p=p+s
{
if (p == NULL || s == NULL)
{
return false;
}

bool s1 = sort(p);//不好,改变了原来数据
bool s2 = sort(s);


if (!s || !s2)
{
return false;
}


elem_type temp1; // p  m
elem_type temp2; // s  n
int m = 0;
int n = 0;


int plength = get_length(p);
int slength = get_length(s);


elem_type pp = *(p->data+plength-1);
elem_type ss = *(s->data+slength-1);


int tmp = get_length(p) < get_length(s) ? get_length(p) : get_length(s);           //得出较小值


get(p, m, &temp1);
get(s, n, &temp2);
for (int i=0;  pp != temp1 && ss != temp2 ; i++)
{
bool s1 = get(p, m, &temp1);
bool s2 = get(s, n, &temp2);
if (!s1 || !s2)
{
return false;
}
 //p m 9   s n 23
if(temp1 < temp2)
{
m++;
}
else
{
insert(p, m, temp2);
n++;
}
}


if(plength == tmp)
{
while(tmp < slength)
{
get(s, n, &temp1);
insert_tail(p,temp1);
n++;
m++;
tmp++;
}
}
return false;
}


bool same_data(Dlist *p, Dlist *s, Dlist *m)//p与s中相同的取出放到m线性表中去
{
if (p == NULL || s == NULL || m == NULL)
{
return false;
}
for (int i=0; i<get_length(p); i++)
{
if (search_yes_or_no(s, *(p->data+i)))
{
insert_tail(m,*(p->data+i));
}
}
return true;
}







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值