赞
踩
线性表是一种最常用也是最简单的数据结构。简单来讲,一个线性表是n个数据元素的有限排列,在不同情况下,每个数据元素有着不同的含义。
一个线性表的结构体由三部分组成:1.线性表中的元素(Elem)2.线性表的当前长度(Length)3、线性表当前分配的储存空间大小(ListSize,通常情况下ListSize>Length)
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<windows.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10
使用typedef与define是为了提高程序的可读性。
typedef struct
{
ElemType *elem; //线性表的基地址
int length; //线性表的当前长度
int listsize; //线性表当前储存空间大小
}SqList;
第一步:使用malloc函数为线性表动态分配内存空间,由于申请内存空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。
Status InitList(SqList *L)
{
L->length = 0;
L->listsize = LIST_INIT_SIZE;
L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->elem)
{
printf("储存空间分配失败\n");
exit(OVERFLOW);
}
printf("一个空的线性表已经构建成功\n");
return OK;
}
对线性表的大小进行赋值,如果超过原来的大小,则使用realloc函数重新分配大小。
Status ValueList(SqList *L) { int i,j; printf("请输入线性表元素的个数: "); scanf("%d",&i); if(i > L->listsize) { while(1) { if(i > L->listsize) { L->elem = (ElemType *)realloc(L->elem,LISTINCREMENT * sizeof(ElemType)); L->listsize += LISTINCREMENT; } else break; } } for(j = 0; j < i;j++) { printf("请输入第%d个元素: ",j+1); scanf("%d",&L->elem[j]); } L->length = i; printf("赋值成功\n"); return OK; }
Status ClearList_Sq(SqList *L)
{
if(L->elem)
{
L->length = 0;
printf("线性表已重置\n");
return OK;
}
else
printf("线性表不存在,无法重置\n");
return OK;
}
插入的原理是确认插入位置后,将插入位置上及之后的元素向后移动一位。在这里,定义指针q,并将指针q赋值为当前插入位置的元素。利用for循环,向后移动元素,最后还要将数组长度扩大一位。
Status ListInsert(SqList *L) { int i; int e; ElemType *newbase; int *q,*p; printf("请输入插入的位置: "); scanf(" %d",&i); if(i < 1 || i > L->length+1) { printf("error\n"); return ERROR; } if(!newbase) { printf("储存空间分配失败\n"); exit(OVERFLOW); } printf("请输入插入的元素 "); scanf(" %d",&e); if(L->length >= L->listsize) { newbase = (ElemType * )realloc(L->elem,(L->listsize + LISTINCREMENT)*sizeof(ElemType)); L->elem = newbase; L->listsize += LISTINCREMENT; } q = &(L->elem[i-1]); for(p = &(L->elem[L->length - 1]);p >= q;--p) *(p+1) = *p; *q = e; ++L->length; return OK; }
与插入元素的原理类似
Status DeleteList(SqList *L) { int i; printf("请输入删除元素的位置"); scanf(" %d",&i); if(i < 1 || i > L->length) { printf("error\n"); return ERROR; } int *p,*q; p = &(L->elem[L->length-1]); for(q = &(L->elem[i-1]);q < p;q++) *q = *(q+1); --L->length; return OK; }
Status PrintList(SqList *L)
{
printf("线性表的长度是%d\n",L->length);
printf("当前的元素是 ");
for(int k = 0;k<L->length;k++)
{
printf("\t%d\t",L->elem[k]);
}
printf("\n");
return OK;
}
如有需要改进的地方,请各位大佬在评论区留言,谢谢大家。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。