線形テーブルの初期化、挿入、削除、および検索操作のC言語実装
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define LIST_INIT_SIZE 100
#define LIST_INCREAMENT 10
/*定义线性表的结构*/
typedef struct
{
int *elem; //线性表存储空间基址
int length; //线性表当前长度
int list_size; //当前分配的存储容量
} SqList;
//线性表的初始化
int InitList(SqList *L)
{
//将L->elem这个指针指向一块通过malloc函数分配的内存的地址
//申请 LIST_INIT_SIZE 个大小为整型(int)字节的空间,
//应该是把申请到的空间的首部位置的地址赋给L->elem
//sizeof(int)是计算int的大小,int类型是4个字节
//malloc是分配空间的意思,是C语言中特有的
L->elem=(int *)malloc( LIST_INIT_SIZE * sizeof(int) );
//存储空间分配失败
if( !L->elem ){
printf("OVERFLOW!");
return ERROR;
}
//空线性表长度初始化为0;
L->length = 0;
//线性表的初始容量为初始分配空间
L->list_size = LIST_INIT_SIZE;
return OK;
}
//线性表的查找
int LocateElem(SqList L, int e)
{
int *p;
int i = 1;
//线性表首地址
p = L.elem;
//*p++ 代表先取当前地址存储的内容,然后地址自增
while( i<=L.length && (*p++)!=e )
++i;
if(i <= L.length)
return i;
else
return 0;
}
//插入数据
int ListInsert(SqList *L, int i, int e)
{
int *newbase;
int j;
//插入位置小于1或大于线性表的长度+1,则为无效输入位置
if( i < 1 || i > L->length + 1 )
return ERROR;
//如果线性表的当前长度大于等于线性表的存储空间长度
//增加分配存储空间
if( L->length >= L->list_size )
{
//尝试调整之前所分配的内存块的大小,具体做法百度
//newbase为整形指针,指向调整后分配空间的首地址,
newbase = (int *)realloc(L->elem, (LIST_INIT_SIZE + LIST_INCREAMENT) * sizeof(int));
if( !newbase ){
printf("内存空间已满\n");
return ERROR;
}
//调整后分配空间的首地址(基址)
L->elem = newbase;
//调整后空间的存储容量
L->list_size = L->list_size + LIST_INCREAMENT;
}
//要想把新元素插入线性表的第i个位置,
//需要把从第i个位置开始往后的所有元素向后移动一位
//为了防止覆盖,做法是从最后一个元素先往后移动一位,之前的元素按次往后移动
//空间地址序号从0开始,则线性表最后一位的序号为L->length-1
//第i个位置的地址序号为i-1
for(j = (L->length)-1; j >= i-1; j--)
L->elem[j+1] = L->elem[j];
//然后把新元素插入第i个位置
L->elem[i-1]=e;
//当前线性表长度加1
++L->length;
return OK;
}
//删除线性表中的数据
int ListDelete(SqList *L, int i)
{
int j, e;
//无效的删除位置
if( i < 1 || i > L->length)
return ERROR;
//把被删除的元素赋给e
//这一句有问题
e = L->elem[i-1];
//指针p指向被删除元素的地址
//这里p没有用到
//p = &( L->elem[i-1] );
for(j=i; j < L->length; j++)
L->elem[j-1] = L->elem[j];
L->length--;
return e;
}
//输出线性表全部元素
void ListOutput(SqList *L, char *s)
{
printf("%s", s);
int i;
for(i=0; i < L->length; i++)
printf("%d ", L->elem[i]);
printf("\n");
}
int main()
{
SqList L;
int flag;
int n, i, e, j, k, k_p;
//初始化顺序表
flag = InitList(&L);
if(flag)
printf("List init sucess!\n");
else
printf("Fail code is %d.", flag);
//插入
printf("\nInput n: ");
scanf("%d", &n);
printf("\nPlease input %d elements:\n", n);
for(i=1; i<=n; i++)
{
scanf("%d", &e);
flag = ListInsert(&L, i, e);
if(!flag)
printf("Fail code is %d.", flag);
}
ListOutput(&L, "\nShow list all elements :");
//当前线性表长度
printf("\nCurrent List length: %d\n", L.length);
//删除第j个位置的元素
printf("\nInput delete element position: ");
scanf("%d", &j);
e = ListDelete(&L, j);
printf("List delete %dth element sucess!\n", j);
printf("delete %dth element is: %d\n", j, e);
ListOutput(&L, "\nShow list all elements :");
printf("\nCurrent List length: %d\n", L.length);
//查找元素,返回在线性表里的位置
printf("\nInput the seeking element: ");
scanf("%d", &k);
k_p = LocateElem(L, k);
printf("the position of %d is %d in List.\n", k, k_p);
}