顺序表
题目:
代码片段:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义符号常量
#define LIST_INIT_SIZE 50
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
// 定义元素类型
typedef int ElemType;
typedef int Status;
typedef int LElemType_Sq;
// 定义顺序表类型
typedef struct {
ElemType *elem; // 顺序表元素
int length; // 顺序表长度
int listsize; // 顺序表存储容量
} SqList;
//初始化一个顺序表
Status InitList_Sq(SqList *L)
{
(*L).elem = (LElemType_Sq*)malloc(LIST_INIT_SIZE*sizeof(LElemType_Sq));
if(!(*L).elem)
exit(OVERFLOW); //分配内存失败
(*L).length = 0; //初始化顺序表长度为0
(*L).listsize = LIST_INIT_SIZE; //顺序表初始内存分配量
printf("yes\n");
return OK; //初始化成功
}
//在顺序表L的第i个位插入元素e
Status ListInsert_Sq(SqList *L, int i, LElemType_Sq e)
{
LElemType_Sq *newbase;
LElemType_Sq *p, *q;
if(i<1 || i>(*L).length+1)
return ERROR; //i值不合法
if((*L).length >= (*L).listsize) //若存储空间已满,需开辟新空间
{
newbase = (LElemType_Sq*)realloc((*L).elem, ((*L).listsize+LISTINCREMENT)*sizeof(LElemType_Sq));
if(!newbase)
exit(OVERFLOW);
(*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
(*L).length++; //表长增1
return OK;
}
void Visit(LElemType_Sq x)
{
printf("%d ",x);
}
//遍历一个顺序表
Status ListTraverse_Sq(SqList L)
{
int i;
for(i=0; i<L.length; i++)
Visit(L.elem[i]);
printf("\n");
return OK;
}
//比较并插入值
Status ListInsertAfterCompare(SqList &L,LElemType_Sq x){
int pos=0;//记录顺序表中 x应该插入的位置
for(int i=0;i<L.length;i++)
{
if(L.elem[i]>=x) //如果顺序表中轮到的元素比x还要大,则x应该插在这个元素的前面
{
pos=i+1;
ListInsert_Sq(&L,pos,x);
break;
}
else if(i==L.length-1) //此时x大于所有顺序表内元素,直接插在表尾即可
{
ListInsert_Sq(&L,L.length+1,x);
break;
}
}
}
int main()
{
SqList l1; //初始化一个表的数据结构叫l1
InitList_Sq(&l1); //为l1分配空间 初始化
for(int i=1;i<20;i++)
{
ListInsert_Sq(&l1,i,i*2); //为表输入递增的元素(这里是随便弄了一串,也可以自己输入一串)
}
ListTraverse_Sq(l1); //按顺序输出表
int x;
scanf("%d",&x); //读取输入的值记为x 即待插入的值
ListInsertAfterCompare(l1,x); //在顺序表中比较后插入
ListTraverse_Sq(l1); //再次输出插入后的顺序表
}
结果: