/*
静态顺序存储线性表的基本实现
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Status int
#define LIST_INITSIZE 100
#define ElemType int
#define OK 1
#define ERROR 0
typedef struct
{
ElemType elem[LIST_INITSIZE];
int length;
}SqList;
Status InitList(SqList* L)//初始化
{
L->length = 0;
return OK;
}
Status ListInsert(SqList* L, int i, ElemType e)//i:插入的位置,e:插入的元素//插入
{
int j;
if (i<1 || i>L->length + 1)
return ERROR;//判断非法输入
if (L->length == LIST_INITSIZE)//判满
{
printf("表已满");//提示
return ERROR;//返回失败
}
for (j = L->length; j > i - 1; j--)//从后往前覆盖,注意i是从1开始
L->elem[j] = L->elem[j - 1];
L->elem[i - 1] = e;//在留出的位置赋值
(L->length)++;//表长加1
return OK;//反回成功
}
Status ListDelete(SqList* L, int i, ElemType* e)//删除
{
if (i<1 || i>L->length)//非法输入/表空
return ERROR;
*e = L->elem[i - 1];//为了返回值
for (int j = i - 1; j <= L->length; j++)//从前往后覆盖
L->elem[j] = L->elem[j + 1];
(L->length)--;//长度减1
return OK;//返回删除值
}
void ListPrint(SqList L)//输出打印
{
int i;
for (i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
printf("\n");//为了美观
}
void DisCreat(SqList A, SqList* B, SqList* C)//拆分(按正负),也可以根据需求改
{
int i;
for (int i = 0; i < A.length; i++)
{
if (A.elem[i] < 0)
ListInsert(B, B->length + 1, A.elem[i]);
else
ListInsert(C, C->length + 1, A.elem[i]);
}
}
int main(void)
{
//复制的
SqList L;
SqList B, C;
int i;
ElemType e;
ElemType data[9] = { 11,-22,33,-3,-88,21,77,0,-9 };
InitList(&L);
InitList(&B);
InitList(&C);
for (i = 1; i <= 9; i++)
ListInsert(&L, i, data[i - 1]);
printf("插入完成后L = : ");
ListPrint(L);
ListDelete(&L, 1, &e);
printf("删除第1个后L = : ");
ListPrint(L);
DisCreat(L, &B, &C);
printf("拆分L后B = : ");
ListPrint(B);
printf("拆分L后C = : ");
ListPrint(C);
printf("拆分L后L = : ");
ListPrint(L);
}
/*
动态顺序存储线性表的基本实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define ElemType int
#define Status int
#define ERROR 0;
#define OK 1;
typedef struct
{
ElemType* elem;
int length;
int listsize;
}SqList;
Status InitList(SqList* L)//初始化
{
L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));//申请100空间
if (!L->elem)//申请失败
return ERROR;
L->length = 0;//长度为零
L->listsize = LIST_INIT_SIZE;//容量100
return OK;
}
Status ListInsert(SqList* L, int i, ElemType e)//插入
{
ElemType* newbase;
if (i<1 || i>L->length + 1)
return ERROR;//非法输入
if (L->length >= L->listsize)//存满了,需要更大空间
{
newbase = (ElemType*)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));//大10的空间
if (!newbase)//申请失败
return ERROR;
L->elem = newbase;//调指针
L->listsize += LISTINCREMENT;//新容量
}
for (int j = L->length; j > i - 1; j--)//从后往前覆盖
L->elem[j] = L->elem[j - 1];
L->elem[i - 1] = e;//在留出的位置赋值
L->length++;//长度+1
return OK;
}
Status ListDelete(SqList* L, int i, ElemType* e)//删除
{
int j;
if (i<1 || i>L->length)//非法输入/表空
return ERROR;
*e = L->elem[i - 1];//为了返回值
for (j = i - 1; j <= L->length; j++)//从前往后覆盖
L->elem[j] = L->elem[j + 1];
(L->length)--;//长度减1
return OK;//返回删除值
}
void ListPrint(SqList L)//输出打印
{
for (int i = 0; i < L.length; i++)
printf("%d", L.elem[i]);
printf("\n");//为了美观
}
void DeleteMin(SqList* L)//删除最小
{
//表空在Listdelete函数里判断
int i;
int j = 0;//最小值下标
ElemType* e=nullptr;
for (i = 0; i < L->length; i++)//寻找最小
{
if (L->elem[i] < L->elem[j])
j = i;
}
ListDelete(L, j + 1, e);//调用删除,注意j要+1
}
int main(void)
{
SqList L;
int i;
ElemType e;
ElemType data[9] = { 11,-22,-33,3,-88,21,77,0,-9 };
InitList(&L);
for (i = 1; i <= 9; i++)
{
ListInsert(&L, i, data[i - 1]);
}
printf("插入完成后 L = : ");
ListPrint(L);
ListDelete(&L, 2, &e);
printf("删除第 2 个后L = : ");
ListPrint(L);
DeleteMin(&L);
printf("删除L中最小值后L = : ");
ListPrint(L);
DeleteMin(&L);
printf("删除L中最小值后L = : ");
ListPrint(L);
DeleteMin(&L);
printf("删除L中最小值后L = : ");
ListPrint(L);
}