非科班出身学生学习计算机数据结构课程实操练习,用以巩固学习知识,项目函数有实操验证且结果符合预期。
代码取用自由,放出来也是自己方便复习。
如有算法上的漏洞或建议,可在评论区提出。
assert函数解释
assert 宏的原型定义在 assert.h 中,其作用是如果它的条件返回错误,则终止程序执行。
线性表定义(动态空间分配)
typedef struct SeqList
{
int *data; /* data */
int MaxSize, length;
} SeqList;
线性表初始化
void InitSeqList(SeqList *L)
{
assert(L != NULL);
L->data = NULL;
L->length = 0;
L->MaxSize = 0;
}
线性表尾插
void SeqListPushBack(SeqList *L, int x)
{
assert(L != NULL);
CheckCapacity(L);
L->data[L->length] = x;
L->length++;
}
线性表值打印
void SeqListPrint(const SeqList *L)
{
assert(L != NULL);
if (L->length == 0)
{
printf("there is nothing in SeqList!!!\n"); /* code */
}
for (int i = 0; i < L->length; i++)
{
printf("%d\n", L->data[i]); /* code */
}
}
线性表按值查找,并返回该值在表中的位号
int SeqListFine(const SeqList *L, int x)
{
assert(L != NULL);
for (int i = 0; i < L->length; i++)
{
if (L->data[i] == x)
{
return i; /* code */
}
}
return -1; /* code */
}
线性表按位插入
void SeqListInsert(SeqList *L, int pos, int x)
{
assert(L != NULL);
assert(pos >= 0 && pos <= L->length);
CheckCapacity(L);
for (int i = L->length; i > pos; i--)
{
L->data[i] = L->data[i - 1]; /* code */
}
L->data[pos] = x;
L->length++;
}
类似,可修改方法作为表头元素插入
void SeqListPushFront(SeqList *L, int x)
{
SeqListInsert(L, 0, x);
}
线性表按位删除
void SeqListErase(SeqList *L, int pos)
{
assert(L != NULL);
assert(L->length > 0);
assert(pos >= 0 && pos <= L->length);
for (int i = pos + 1; i < L->length; i++)
{
L->data[i - 1] = L->data[i]; /* code */
}
L->length--;
}
类似,可以修改方法作为表头元素删除
void SeqListEraseFront(SeqList *L)
{
SeqListErase(L, 0);
}
线性表按位修改元素的值
void ChangeTheDataofCertainPos(SeqList *L, int pos, int x)
{
assert(L != NULL);
assert(L->length > 0);
assert(pos >= 0 && pos <= L->length);
L->data[pos] = x;
}
最后独自尝试写了王道结构书上的综合应用题第一题。
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删除元素的值。空出元素的位置由最后一个元素填补,若顺序表为空,则显示出错信息并推出运行。
int DeleteTheMiniumNumber(SeqList *L)
{
assert(L != NULL);
assert(L->length > 0);
int a = 0;
int c;
for (int i = 0; i < L->length; i++)
{
a=L->data[0];
if (a > L->data[i + 1])
{
a = L->data[i+1];/* code */
}
/* code */
}
c=L->data[a];
L->data[a]=L->data[L->length-1];
L->length--;
return c;
}
附测试模块函数时的主函数
int main()
{
SeqList L;
InitSeqList(&L);
SeqListPushBack(&L, 2);
SeqListPushBack(&L, 3);
SeqListPushBack(&L, 1);
SeqListPushBack(&L, 4);
SeqListPushBack(&L, 0);
SeqListPushBack(&L, 5);
SeqListPrint(&L);
printf("\n\nafter inserting an element in a certain position\n");
SeqListInsert(&L, 2, 10);
SeqListPrint(&L);
printf("\n\nafter inserting an element in the front of this sequence list\n");
SeqListPushFront(&L, 9);
SeqListPrint(&L);
printf("\n\nafter erasing the third element of this sequence list\n");
SeqListErase(&L, 3);
SeqListPrint(&L);
printf("\n\nafter erasing the first element of this sequence list\n");
SeqListEraseFront(&L);
SeqListPrint(&L);
printf("\n\nthe length of this sequence list is %d\n", SeqListLength(&L));
printf("\n\nafter change this data in certain position :\n");
ChangeTheDataofCertainPos(&L, 4, 10);
SeqListPrint(&L);
printf("\n\nthe minimum element is %d\n",DeleteTheMiniumNumber(&L));
SeqListPrint(&L);
return 0;
}