线性表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
int *elem;
int length;
int listsize;
}SqList;
void nouse(void)//为了使界面更清晰
{
int i;
printf("\n");
for (i = 50;i > 0;i--)
printf("*");
printf("\n");
}
Status creat_sq(SqList *L)
//建立一个线性表
{
L->elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L->elem) exit(OVERFLOW);
L->length = LISTINCREMENT;
L->listsize = LIST_INIT_SIZE;
return OK;
}//creat_aq
Status DestroyList(SqList *L)
//若线性表L已存在,则释放
{
if (L->elem)
{
free(L->elem);
}
return OK;
}//DestroyList
Status ClearList(SqList *L)
//若线性表L不为空,则将其置为空表
{
if (L->length > 0)
{
L->length = 0;
}
return OK;
}//ClearList
void input_sq(SqList *L)
//为线性表赋值
{
int *p;
int i = 1,n = 0;
char c;
printf("输入要建立的线性表的长度(n < L->listsize):");
scanf("%d",&n);
printf("\n");
if (creat_sq(L))
{
p = L->elem;
if (n <= L->listsize)
{
for (;(p <= L->elem + n - 1);p++)//为线性表赋值
{
printf("输入第%d个数据:",i++);
scanf("%d",p);
printf("\n");
}
L->length = n;
}
else
{
printf("数据不合法!\n");
c = getchar();//无特殊作用,为了使窗口停留
c = getchar();
exit(0);
}
}
}//input_sq
void output_sq(SqList *L)
//输出线性表中的值
{
int i;
for (i = 0;i < L->length;i++)
printf("%3d",*(L->elem + i));
}//output_sq
Status compare(int x,int y)
//比较两个整数的大小
{
if (x == y) return OK;
return ERROR;
}//compare
int LocatElem_sq(SqList *L,int e,Status (*compare)(int x,int y))
//在顺序线性表中查找第一个与e满足compare()的元素的位置//若找到,返回其位序,否则返回0
{
int i = 1;
int *p;
p = L->elem;
while ((i<=L->length) && (!(*compare)(*p++, e)))
{
++i;
}
if (i <= L->length)
return i;
return ERROR;
}//LocatElem_sq
Status Listinsert_sq(SqList *L,int i,int e)
//在线性表中第i个元素之前插入元素e
//i的取值范围为1<= i <= L.length + 1
{
int *newbase;
int *q;
int *p;
if ((i<1) && (i>L->length+1))
{
return ERROR; //i值不合法
}
if (L->length >= L->listsize)
{
newbase = (int *)realloc(L->elem,
(L->listsize + LISTINCREMENT)*sizeof(int));
if (!newbase)
{
exit(0);
}
L->elem = newbase;//新基址
L->listsize += LISTINCREMENT;//增加存储容量
}
q = &(L->elem[i-1]);//q为插入位置
for (p=&(L->elem[L->length-1]); p>=q; --p)
{
*(p+1) = *p;
}
*q = e;//插入e