#include <stdio.h>
#include <stdlib.h>
//需求,写一个顺序线性表,存储一个地址位置
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //函数结果状态码
typedef struct{
int x;
int y;
}Point2D;
typedef struct{
Point2D * element; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(elementType为单位))
}SqList;
//初始化顺序表
Status InitList(SqList * L){
//分配一个listsize的空间(现在element就是一个数组)
L->element=(Point2D*)malloc(LIST_INIT_SIZE*sizeof(Point2D));
if(!L->element){
//没有申请到空间
exit(OVERFLOW);
}
//申请成功之后,长度设置为0
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
//插入元素(向顺序表中插入的第i个位置之前插入数据p)
Status ListInsert(SqList * L,int i,Point2D p){
int j;
//判断插入的位置是否合法
//i的合法位置为1 ListLength(L)+1
if(i<1||i>L->length+1){
//i的范围不合法
return ERROR;
}
if(L->length>=L->listsize){
//如果大于等于最大的分配长度,则表示需要重新来分配内存
Point2D * p=(Point2D*)realloc(L->element,(L->listsize+LISTINCREMENT)*sizeof(Point2D));
if(!p){
//如果为空则表示分配失败
return ERROR;
}
//分配成功
L->element=p; //新基址
L->listsize+=LISTINCREMENT;
}
//如果都是合法的则将数据给插入进来,将第i个位置和之后的元素向后移动一个位置
for(j=L->length-1;j>=i-1;j--){
L->element[j+1]=L->element[j];
}
//再i-1空间上写数据
L->element[i-1]=p;
//将长度加1
L->length++;
return OK;
}
//合并顺序列表(将l1和l2中的元素给合并到l3中) l3必须在外面就进行分配内存空间
void MergeList(SqList l1,SqList l2,SqList *l3){
Point2D *l1_last,*l2_last;
Point2D *l1_start,*l2_start,*l3_start;
int i=l1.length+l2.length;
l3->length=l3->listsize=i;
l3_start=l3->element=(Point2D*)malloc(sizeof(Point2D));
if(!l3){
exit(OVERFLOW);
}
l1_start=l1.element;
l2_start=l2.element;
l1_last=l1.element+l1.length-1;
l2_last=l2.element+l2.length-1;
while(l1_start<=l1_last&&l2_start<=l2_last){
if(l1_start->x>l2_start->x){
*l3_start=*l1_start;
l3_start++;
l1_start++;
}else if(l1_start->x<l2_start->x){
*l3_start=*l2_start;
l3_start++;
l2_start++;
}else{
//相等
*l3_start=*l2_start;
l3_start++;
l2_start++;
l1_start++;
}
}
while(l1_start<=l1_last){
*l3_start=*l1_start;
l3_start++;
l1_start++;
}
while(l2_start<=l2_last){
*l3_start=*l2_start;
l3_start++;
l2_start;
}
}
//测试
int main(){
int i;
SqList * L1=(SqList *)malloc(sizeof(SqList));
Point2D p={1,2};
//初始化一个指向结构体的指针
//该结构体分配一块空间用来存储数组的首地址,数组的长度,数组的最大容量
SqList * L=(SqList*)malloc(sizeof(SqList));
i=InitList(L);
if(i==OK){
printf("创建成功");
}
i=ListInsert(L,1,p);
if(i==OK){
printf("插入成功");
}
i=ListInsert(L,2,p);
//打印插入的数据元素
printf("数据x为%d,数据y为:%d,顺序表的长度为%d",L->element[0].x,L->element[0].y,L->length);
printf("hello world");
printf("新创建一个顺序列表的集合");
MergeList(*L,*L,L1);
printf("合并后的顺序表的长度为%d,总容量为%d\n",L1->length,L1->listsize);
while(L1->element->x){
printf("数据的x值为:%d\n",L1->element->x);
L1->element++;
}
scanf("%d",&i);
}
#include <stdlib.h>
//需求,写一个顺序线性表,存储一个地址位置
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; //函数结果状态码
typedef struct{
int x;
int y;
}Point2D;
typedef struct{
Point2D * element; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量(以sizeof(elementType为单位))
}SqList;
//初始化顺序表
Status InitList(SqList * L){
//分配一个listsize的空间(现在element就是一个数组)
L->element=(Point2D*)malloc(LIST_INIT_SIZE*sizeof(Point2D));
if(!L->element){
//没有申请到空间
exit(OVERFLOW);
}
//申请成功之后,长度设置为0
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
//插入元素(向顺序表中插入的第i个位置之前插入数据p)
Status ListInsert(SqList * L,int i,Point2D p){
int j;
//判断插入的位置是否合法
//i的合法位置为1 ListLength(L)+1
if(i<1||i>L->length+1){
//i的范围不合法
return ERROR;
}
if(L->length>=L->listsize){
//如果大于等于最大的分配长度,则表示需要重新来分配内存
Point2D * p=(Point2D*)realloc(L->element,(L->listsize+LISTINCREMENT)*sizeof(Point2D));
if(!p){
//如果为空则表示分配失败
return ERROR;
}
//分配成功
L->element=p; //新基址
L->listsize+=LISTINCREMENT;
}
//如果都是合法的则将数据给插入进来,将第i个位置和之后的元素向后移动一个位置
for(j=L->length-1;j>=i-1;j--){
L->element[j+1]=L->element[j];
}
//再i-1空间上写数据
L->element[i-1]=p;
//将长度加1
L->length++;
return OK;
}
//合并顺序列表(将l1和l2中的元素给合并到l3中) l3必须在外面就进行分配内存空间
void MergeList(SqList l1,SqList l2,SqList *l3){
Point2D *l1_last,*l2_last;
Point2D *l1_start,*l2_start,*l3_start;
int i=l1.length+l2.length;
l3->length=l3->listsize=i;
l3_start=l3->element=(Point2D*)malloc(sizeof(Point2D));
if(!l3){
exit(OVERFLOW);
}
l1_start=l1.element;
l2_start=l2.element;
l1_last=l1.element+l1.length-1;
l2_last=l2.element+l2.length-1;
while(l1_start<=l1_last&&l2_start<=l2_last){
if(l1_start->x>l2_start->x){
*l3_start=*l1_start;
l3_start++;
l1_start++;
}else if(l1_start->x<l2_start->x){
*l3_start=*l2_start;
l3_start++;
l2_start++;
}else{
//相等
*l3_start=*l2_start;
l3_start++;
l2_start++;
l1_start++;
}
}
while(l1_start<=l1_last){
*l3_start=*l1_start;
l3_start++;
l1_start++;
}
while(l2_start<=l2_last){
*l3_start=*l2_start;
l3_start++;
l2_start;
}
}
//测试
int main(){
int i;
SqList * L1=(SqList *)malloc(sizeof(SqList));
Point2D p={1,2};
//初始化一个指向结构体的指针
//该结构体分配一块空间用来存储数组的首地址,数组的长度,数组的最大容量
SqList * L=(SqList*)malloc(sizeof(SqList));
i=InitList(L);
if(i==OK){
printf("创建成功");
}
i=ListInsert(L,1,p);
if(i==OK){
printf("插入成功");
}
i=ListInsert(L,2,p);
//打印插入的数据元素
printf("数据x为%d,数据y为:%d,顺序表的长度为%d",L->element[0].x,L->element[0].y,L->length);
printf("hello world");
printf("新创建一个顺序列表的集合");
MergeList(*L,*L,L1);
printf("合并后的顺序表的长度为%d,总容量为%d\n",L1->length,L1->listsize);
while(L1->element->x){
printf("数据的x值为:%d\n",L1->element->x);
L1->element++;
}
scanf("%d",&i);
}