#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LIST_INCRESMENT 10
#define ERROR 0
#define OVERFLOW -1
#define OK 1
typedef int ElemType;
typedef struct{
int length;
int listSize;
ElemType *data;
}linklist;
/
顺序表位序从1开始
/**
* 顺序表初始化
* @brief initList
* @param list
*/
int init_Sqlist(linklist *list)
{
//data数据域分配内存
list->data = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!list->data) exit(OVERFLOW);
list->length = 0;
list->listSize = LIST_INIT_SIZE;
return OK;
}
void againMalloc(linklist *list)
{
ElemType *newbase;
newbase = (ElemType *)realloc(list->data,(LIST_INIT_SIZE+LIST_INCRESMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
list->data = newbase;
}
/**
* @brief insert
* @param list 顺序表
* @param data 数据
* @param pos 插入位置
* @return
*/
int insert_Sqlist(linklist *list,ElemType data,int pos)
{
ElemType *p,*q;
if(pos < 0) return ERROR;
if(list->length >= list->listSize) againMalloc(list);
if(pos > list->length){
list->data[list->length] = data;
}else{
if(pos >= 1){
p = list->data+pos-1 ;//或者list->data+pos-1
}else if(pos == 0){
p = list->data;
}
for(q = list->data + list->length;q >= p;q--)
{
*(q+1) = *q;
}
*p = data;
}
list->length++;
return OK;
}
int delete_Sqlist(linklist *list,int pos,ElemType *e)
{
ElemType *p;
if(pos <1 || pos > list->length) return ERROR;
*e = list->data[pos-1];
for(p = list->data + pos -1;p<(list->data+list->length);p++){
*p = *(p +1);
}
list->length --;
return OK;
}
int equaldata(ElemType listdata,ElemType data)
{
if(listdata == data) return OK;
else return ERROR;
}
//查找
int locate_Sqlist(linklist *list,ElemType data,int (*compare)(ElemType listdata,ElemType data))
{
int i = 1,*p = list->data;
while(i <= list->length && !(*compare)(*p++,data)) i++;
if(i <= list->length) return i;
else return 0;
}
/**
*线性表的合并,知la与lb为非递减排列,即不严格的递增排列
* @brief merge_Sqlist
* @param la
* @param lb
* @param lc
* @return
*/
void merge_Sqlist(linklist *la,linklist *lb,linklist *lc)
{
ElemType *pa = la->data,*pb = lb->data,*pc;
lc->length = la->length + lb->length;
pc = lc->data = (ElemType*)malloc(lc->length*sizeof(ElemType));
if(!lc->data) exit(OVERFLOW);
while(pa < (la->data + la->length) && pb < (lb->data + lb->length)){
if(*pa < *pb) *pc++ = *pa++;
else *pc++ = *pb++;
}
while(pa < (la->data + la->length)) *pc++ = *pa++;
while(pb < (lb->data + lb->length)) *pc++ = *pb++;
}
/**
*遍历
* @brief travelList
* @param list
*/
void travelList(linklist *list)
{
ElemType *x;
x = list->data;
while(x <(list->data + list->length))
{
printf("%d ",*x++);
}
printf("\n");
}
void free_Sqlist(linklist *list)
{
free(list);
list = NULL;
}
int main(void)
{//如果使用结构体指针,必须进行结构体指针的内存分配,指针型变量初始化后在使用,不然容易出现野指针
linklist *l,ll,result;
int m,data;
int a[5] = {66,66,77,88,99};
int b[] = {1,65,66,68,98,100,999};
l = (linklist *)malloc(1*sizeof(linklist));
init_Sqlist(l);
for(m=0;m<5;m++){
insert_Sqlist(l,a[m],6);
}
delete_Sqlist(l,1,&data);
printf("删除:data->%d\n",data);
travelList(l);
printf("查找66位置:%d\n",locate_Sqlist(l,66,equaldata));
printf("查找99位置:%d\n",locate_Sqlist(l,99,equaldata));
init_Sqlist(&ll);
for(m=0;m<7;m++){
insert_Sqlist(&ll,b[m],10);
}
travelList(&ll);
merge_Sqlist(l,&ll,&result);
travelList(&result);
free_Sqlist(l);
return 0;
}
顺序表实现-c
最新推荐文章于 2022-11-02 16:22:51 发布