C语言建立顺序表,实现插入、删除、减、并、去重等操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define INIT_SIZE 20
#define INC 5
typedef int ElemType;
typedef struct
{
ElemType *data;//存储数据
int len;//当前存储数据长度
int size;//最大存储数据长度,容量
}List;
//建立
int createList(List *L)
{
L->data = (ElemType *) malloc(INIT_SIZE * sizeof(ElemType));
if(!L->data) return 0;
L->len = 0;//初始长度为0
L->size = INIT_SIZE;//初始容量为INIT_SIZE(20)
return 1;
}
//按位置插入
int insertListPos(List *L, int pos, ElemType e)
{
if(pos < 1 || pos > L->len+1) return 0;//插入位置错误
if(L->len >= L->size)
{
L->data = (ElemType *) realloc(L->data, (L->size + INC) * sizeof(ElemType));//申请空间
if(!L->data) return 0;
L->size += INC;//改变容量
}
int i;
for(i = L->len-1; i >= pos-1; i --)
{
L->data[i+1] = L->data[i];//依次后移
}
L->data[pos-1] = e;//将e插入空位
L->len ++;//长度增加1
return 1;
}
//按顺序插入,保持有序
int insertListSort(List *L, ElemType e)
{
if(L->len >= L->size)
{
L->data = (ElemType *) realloc(L->data, (L->size + INC) * sizeof(ElemType));//申请空间
if(!L->data) return 0;
L->size += INC;//改变容量
}
int i;
for(i = L->len-1; i >= 0; i --)
{
if(e < L->data[i])
{
L->data[i+1] = L->data[i];//依次后移
}
else break;
}
L->data[i+1] = e;//将e插入空位
L->len ++;//长度增加1
return 1;
}
//按位置删除
int deleteList(List *L, int pos)
{
if(pos < 1 || pos > L->len+1) return 0;
int i;
for(i = pos-1; i <= L->len-1; i ++)
{
L->data[i] = L->data[i+1];//依次前移
}
L->len --;//长度减1
return 1;
}
//打印
int printList(List *L)
{
if(L->len == 0) return 0;//长度为0,顺序表中没有元素,不需要打印
int i;
for(i = 0; i < L->len; i ++)
{
printf("%d ", L->data[i]);
}
return 1;
}
int sub(List *A, List *B)
{
int i, j;
for(i = 0; i < A->len; i ++)
{
for(j = 0; j < B->len; j ++)
{
if(A->data[i] == B->data[j])
{
deleteList(A, i+1);//删除A中与B相同的元素
sub(A, B);//递归调用
}
}
}
return 1;
}
int unionSet(List *A, List *B)
{
int i, j, flag;
for(i = 0; i < B->len; i ++)
{
flag = 0;//标志位置0
for(j = 0; j < A->len; j ++)
{
if(A->data[j] == B->data[i])
{
flag = 1;//标志位置1
break;
}
}
if(!flag) insertListSort(A, B->data[i]);//将B中不同元素添加到A中
}
return 1;
}
int single(List *A)
{
int i, j;
for(i = 0;i < A->len; i ++)
{
for(j = i+1; j < A->len; j ++)
{
if(A->data[i] == A->data[j])
{
deleteList(A, i+1);//删除重复元素
single(A);//递归调用
}
}
}
return 1;
}
int init(List *list1, List *list2)
{
list1->len = 0;//摧毁顺序表
list2->len = 0;
int i;
for(i = 0;i < 10;i ++)
{
insertListSort(list1, i*3);
insertListSort(list2, i*6);
}
return 1;
}
int main()
{
List list1, list2;//定义两个顺序表
ElemType e;
createList(&list1);
createList(&list2);
init(&list1, &list2);
printf("\nlist1 : ");
printList(&list1);
printf("\nlist2 : ");
printList(&list2);
printf("\n演示1 : \n将元素插入list1,并保持有序:");
printf("请输入插入元素:");
scanf("%d", &e);
insertListSort(&list1, e);
printList(&list1);
init(&list1, &list2);
printf("\n演示2 :\n list1 - list2(将list1中和list2相同的元素去掉):");
sub(&list1, &list2);
printList(&list1);
init(&list1, &list2);
printf("\n演示3 :\n list1∪list2:");
unionSet(&list1, &list2);
printList(&list1);
init(&list1, &list2);
printf("\n演示4 :\n 去除list1中重复的元素:");
single(&list1);
printList(&list1);
return 0;
}
运行效果实例:
感谢您花时间耐心看完,希望对您有所帮助。