线性表
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分量
#define LISTINCREMENT 10 //线性表存储空间增量(当存储空间不够时使用)
typedef int ElemType;//元素类型
//声明线性表结构
typedef struct sqlists{
ElemType *elem; //其实内存地址
int length; //表当前长度
int listsize; //分配的总长度
}SqList;
//创建线性表
int InitList(SqList *L){
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem) return -1;
L->length = 0;
L->listsize = LIST_INIT_SIZE;
return 0;
}
//查找元素
int LocateElem(SqList L, ElemType x){
int pos = -1;
for(int i = 0; i < L.length; i++){
if(L.elem[i] == x) pos = i;
}
return pos;
}
//插入元素
int ListInsert(SqList *L, int i, ElemType e){
if(i<1 || i>L->length+1) return -1;
if(L->length >= L->listsize){
ElemType *newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT)*sizeof(ElemType));
if(!newbase) return -1;
L->elem = newbase;
L->listsize += LISTINCREMENT;
}
ElemType *q, *p;
q = &(L->elem[i-1]);
for(p = &(L->elem[L->length-1]); p>=q; --p)
*(p + 1) = *p;
*q = e;
++L->length;
return 0;
}
//删除元素
int ListDelete(SqList *L, int i, ElemType *e){
if(i<1 || i>L->length) return -1;
ElemType *q, *p;
p = &(L->elem[i -1]); //p为被删除元素的位置
*e = *p;//被删除元素赋值给e
q = L->elem + L->length -1;//q指向表尾最后一个元素
for(++p; p <= q; ++p)
*(p - 1) = *p;
--L->length;
return 0;
}
int main()
{
SqList list;
InitList(&list);
//添加10个数字给线性表list
for (int i = 0; i < 10; i++)
ListInsert(&list, i+1, i+1);
printf("线性表初始化之后\n");
for (int i = 0; i < 10; i++)
printf("%d ", list.elem[i]);
//删除第5个
ElemType e;
ListDelete(&list, 5, &e);
printf("\n删除的元素是:%d\n", e);
//在第2个位置插入一个元素-1
ListInsert(&list, 2, -1);
//输出线性表
for (int i = 0; i < 10; i++)
printf("%d ", list.elem[i]);
//输出结果是:1 -1 2 3 4 6 7 8 9 10
//system("pause");
return 10086;
}
【运行结果】
参考资料
使用C语言实现线性表
顺序表的基本操作(C语言详解版)
链表(单链表)的基本操作及C语言实现
请问c语言中malloc函数和realloc的区别