线性表:具有相同特性的数据元素组成的有限序列。顾名思义,线性表有以下特征:
1.线性表有且只有一个开始结点,且这个开始节点没有前驱结点;
2.线性表有且只有一个末尾结点,且这个末尾结点没有后继结点;
3.其他结点有一个前驱结点和一个后继结点;
代码如下:
- seq_table.h
#ifndef _SEQ_TABLE_H
#define _SEQ_TABLE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SEQ_ERR (-1)
#define SEQ_SUCCESS 0
/* 本次测试以char类型数据为例 */
#define DATA_TYPE_IS_CHAR
#if defined DATA_TYPE_IS_CHAR
typedef char DataType;
#elif defined DATA_TYPE_IS_INT
typedef int DataType;
#elif defined DATA_TYPE_IS_FLOAT
typedef float DataType;
#endif
typedef struct seq_table_data{
int capacity; /*顺序表的容量*/
int length; /* 顺序表的实际长度 */
DataType *data; /* 顺序表的数据 */
}*PSeqTable, SeqTable;
/* 初始化一个顺序表 */
PSeqTable InitSeqTable(int capacity);
/* 获取一个顺序表的容量 */
int GetSeqTableCapacity(PSeqTable seqTable);
/* 获取一个顺序表的当前长度 */
int GetSeqTableLength(PSeqTable seqTable);
/* 判断一个顺序表是否为空,若为空返回1,若不为空返回0 */
int SeqTableIsEmpty(PSeqTable seqTable);
/* 获取顺序表中的元素(参数为元素的位置) */
DataType GetSeqTableElement(PSeqTable seqTable, int index);
/* 向顺序表中插入一个元素(参数分别为顺序表、元素值和元素的位置) */
int InsertIntoSeqTable(PSeqTable seqTable, DataType data, int index);
/* 从顺序表中删除一个元素(参数分别为元素值和元素的位置) */
int DeleteFromSeqTable(PSeqTable seqTable, int index);
/* 遍历顺序表 */
void DisplaySeqTable(PSeqTable seqTable);
/* 将一个顺序表中的元素清空并置空 */
void ClearSeqTable(PSeqTable seqTable);
#endif
2.seq_table.c
#include "seq_table.h"
PSeqTable InitSeqTable(int capacity)
{
int option = 1;
PSeqTable seqTable = (PSeqTable)malloc(sizeof(SeqTable));
if(seqTable == NULL || capacity <= 0) {
perror("create sequence table error or invalid input.");
return (PSeqTable)SEQ_ERR;
}
seqTable->capacity = capacity;
seqTable->length = 0;
seqTable->data = (DataType *)malloc(capacity * sizeof(DataType));
if(seqTable->data == NULL) {
perror("create data of sequece table.");
free(seqTable);
return (PSeqTable)SEQ_ERR;
}
memset(seqTable->data, 0, sizeof(DataType) * capacity);
int index = 0;
while(index<capacity) {
if(option == 1) {
switch (index) {
case 0:
printf("Please input the %dst data\n", index + 1);
break;
case 1:
printf("Please input the %dnd data\n", index + 1);
break;
case 2:
printf("Please input the %drd data\n", index + 1);
break;
default:
printf("Please input the %dth data\n", index + 1);
break;
}
#if defined DATA_TYPE_IS_CHAR
seqTable->data[index] = getchar();
#elif defined DATA_TYPE_IS_INT
scanf("%d", &seqTable->data[index]);
#elif defined DATA_TYPE_IS_FLOAT
scanf("%f",&seqTable->data[index]);
#endif
#if defined DATA_TYPE_IS_CHAR
while(getchar() != '\n');
#endif
index++;
seqTable->length++;
printf("select 1/0 to continue or quit.");
scanf("%d", &option);
#if defined DATA_TYPE_IS_CHAR
while(getchar() != '\n');
#endif
} else {
break;
}
}
return seqTable;
}
int GetSeqTableCapacity(PSeqTable seqTable)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return SEQ_ERR;
}
return seqTable->capacity;
}
int GetSeqTableLength(PSeqTable seqTable)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return SEQ_ERR;
}
return seqTable->length;
}
int SeqTableIsEmpty(PSeqTable seqTable)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return SEQ_ERR;
}
return (seqTable->length == 0);
}
DataType GetSeqTableElement(PSeqTable seqTable, int index)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return (DataType)SEQ_ERR;
}
if((index < 0) || (index > seqTable->length - 1)) {
perror("invalid index number.");
return (DataType)SEQ_ERR;
}
return seqTable->data[index];
}
int InsertIntoSeqTable(PSeqTable seqTable, DataType data, int index)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return (DataType)SEQ_ERR;
}
if((index < 0) || (index > seqTable->capacity - 1)) {
perror("invalid index number.");
return (DataType)SEQ_ERR;
}
for(int i=seqTable->length-1; i>=index; i--) {
seqTable->data[i+1] = seqTable->data[i];
}
seqTable->data[index] = data;
seqTable->length++;
return SEQ_SUCCESS;
}
int DeleteFromSeqTable(PSeqTable seqTable, int index)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return SEQ_ERR;
}
if((index < 0) || (index > seqTable->length - 1)) {
perror("invalid index number.");
return SEQ_ERR;
}
for(int i=index; i<seqTable->length; i++) {
seqTable->data[i] = seqTable->data[i+1];
}
seqTable->length--;
return SEQ_SUCCESS;
}
void DisplaySeqTable(PSeqTable seqTable)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return ;
}
for(int i=0; i<seqTable->length; i++) {
#if defined DATA_TYPE_IS_CHAR
printf("%c ", seqTable->data[i]);
#elif defined DATA_TYPE_IS_INT
printf("%d ", seqTable->data[i]);
#elif defined DATA_TYPE_IS_FLOAT
printf("%f ", seqTable->data[i]);
#endif
}
printf("\n");
return ;
}
void ClearSeqTable(PSeqTable seqTable)
{
if(seqTable == NULL) {
perror("sequence table is null.");
return ;
}
free(seqTable->data);
free(seqTable);
printf("clear sequece table completed.\n");
}
3.main.c
#include "seq_table.c"
int main(void)
{
PSeqTable mySeqTable = InitSeqTable(10);
DisplaySeqTable(mySeqTable);
InsertIntoSeqTable(mySeqTable, 'D', 2);
printf("After insert.\n");
DisplaySeqTable(mySeqTable);
DeleteFromSeqTable(mySeqTable, 1);
printf("After delete.\n");
DisplaySeqTable(mySeqTable);
printf("len of seqTable is:%d, capacity is :%d\n", GetSeqTableLength(mySeqTable), GetSeqTableCapacity(mySeqTable));
printf("Is seqTable empty?[%s]\n", SeqTableIsEmpty(mySeqTable)?"yes":"no");
ClearSeqTable(mySeqTable);
return 0;
}