编辑代码

/*------------------------------------------------------------
---------算法3.2 (第72页)建立一个空顺序表----------------
---------算法3.3 (第72页)顺序表中插入结点----------------
------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>

/*---------顺序表类型定义(第71页) -------*/
#define maxsize 1024
typedef int datatype;

typedef struct {
	datatype data[maxsize]; //采用向量存储线性表,data[0]不用,从索引为1的data[1]开始使用
	int last;  //last是顺序表当前的长度
} sequenlist;

//声明函数原型
sequenlist *InitList();
int Length(sequenlist *);
int Insert(sequenlist *, datatype, int);
void PrintList(sequenlist *);

int main() {
	sequenlist *L;
	int i = 0;
	datatype x;
	L = InitList();
	printf("输入若干个整型数据,建立顺序表(输入-1结束):");
	scanf("%d", &x);
	while (x != -1) {
		i++;
		if (!Insert(L, x, i))
			exit(0);
		scanf("%d", &x);
	}
	PrintList(L);      //输出顺序表

    return 0;
}

/*------------------------------------------------------------
---------算法3.2(第72页)建立一个空顺序表----------------
通过函数返回值将结果带回到主调函数
------------------------------------------------------------*/
sequenlist *InitList() {
//分配顺序表的动态存储空间,将表的长度置为0
	sequenlist *L = (sequenlist *)malloc(sizeof(sequenlist));
	L->last = 0;
	return L;
}

int Length(sequenlist *L) {  //求表长度
	printf("表长度为%d.\n", L->last);
	return L->last;
}

/*------------------------------------------------------------
---------算法3.3(第72页)顺序表中插入结点----------------
在顺序表的第i个位置上插入一个新结点x
------------------------------------------------------------*/
int Insert(sequenlist *L, datatype x, int i) {
//将新结点插入顺序表的第i个位置。插入成功返回1;不成功返回0.
	int k;
	if (L->last >= maxsize - 1) {
		printf("表已满.\n");    //插入不成功返回0
		return 0;
	}

	if (i < 1 || i > L->last + 1) {
		printf("非法插入位置.\n");
		return 0;
	}

	for (k = L->last; k >= i; k--) {
		L->data[k + 1] = L->data[k]; //结点后移
	}
	L->data[i] = x; //插入到L->data[i]中。从data[1]开始存放,data[0]不用
	L->last++;   //表长度加1
	return 1;   //插入成功返回1
}

void PrintList(sequenlist *L) { //输出顺序表
	int i;
	printf("顺序表为:\n");
	for (i = 1; i <= L->last; i++)
		printf("%5d", L->data[i]);
	printf("\n");
}