C语言主函数编程规范
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*****************************************************************************/
/*
/* 版权所有 (C)2012, 于林峰(九江学院)
/*
/* 文件名称: 主函数程序文件
/* 文件标识:
/* 内容摘要:
/* 其它说明:
/* 当前版本: V1.0
/* 作 者: 于林峰
/* 完成日期: 2012年11月02日
/* ---------------------------------------------------------------------------
/* 修改记录1:// 修改历史记录,包括修改日期、修改者及修改内容
/* 修改日期:
/* 版 本 号:
/* 修 改 人:
/* 修改内容:
/*
/* 修改记录2:…
/*
/*****************************************************************************/
#include "UniHeader.h"
void main()
{
T_SeqList t_SequentList;
int i, j, k;
ElemType iTmpVal;
ElemType iFrontalElem, iRearElem;
Status iMark;
/*
/* 创建空的顺序线性链表
*/
iMark = InitList(&t_SequentList);
if (OK == iMark)
{
printf("调用创建函数后,顺序线性链表创建成功!\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
}
/*
/* 向顺序线性链表中插入元素后,显示链表中的元素
/*
/* j 表示顺序链表中,欲插入的位置。
/* 注意:
/* j 还不是元素的下标。而是从用户角度直接指定的某个位置(用户是不关心下标是否从 0 开始编号的)。
*/
for (j = 1; j <=5; j++)
{
InsertElem(&t_SequentList, 1, j); // 可以试试将第 2 个参数改为 j 的效果如何
}
printf("调用插入函数后,得到的顺序线性链表为:");
for (j = 1; j <=5; j++)
{
printf("%d ", *(t_SequentList.piElem + j - 1));
}
printf("\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 删除顺序线性链表某个位置处的元素——比如第 1 个元素
*/
i = 1;
DeleteElem(&t_SequentList, i, &iTmpVal);
printf("调用删除函数后,删除了顺序线性链表的第 %d 个元素:%d \n", i, iTmpVal);
printf("现存顺序线性链表为:");
for (j = 1; j <= 4; j++)
{
printf("%d ", *(t_SequentList.piElem + j - 1));
}
printf("\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 判断线性表是否为空
*/
iMark = IsListEmpty(t_SequentList);
printf("调用判空函数后,判明目前顺序线性链表是否空: iMark = %d (1: 是 0: 否) \n", iMark);
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 清空顺序线性链表,再判断其是否已空
*/
ClearList(&t_SequentList);
printf("调用清空函数后,发现目前该链表中有 %d 个元素,共 %d 个存储空间 \n", t_Se
quentList.iLength, t_SequentList.iListSize);
iMark = IsListEmpty(t_SequentList);
printf("调用判空函数后,判明目前顺序线性链表是否空: iMark = %d (1: 是 0: 否) \n", iMark);
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 重新向顺序线性链表中插入 10 个元素后,显示链表中的元素
*/
for (j = 1; j <= 10; j++) // j 表示顺序链表中,从用户角度所见的欲插入的位置
{
InsertElem(&t_SequentList, j, j);
}
printf("调用插入函数后,得到的顺序线性链表为:");
for (j = 1; j <= 10; j++)
{
printf("%d ", *(t_SequentList.piElem + j - 1));
}
printf("\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 向已满的顺序线性链表中插入新的元素——在第 1 个元素前插入 0
*/
iTmpVal = 0;
InsertElem(&t_SequentList, 1, iTmpVal);
printf("调用插入函数在表头插入 %d 后,得到的新链表为:", iTmpVal);
for (j = 1; j <= t_SequentList.iLength; j++)
{
printf("%d ", *(t_SequentList.piElem + j - 1));
}
printf("\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
/*
/* 返回顺序线性链表中第 i 个元素的值——比如第 4 个元素的值
*/
i = 4;
GetElem(t_SequentList, i, &iTmpVal);
printf("调用取值函数后,得到的第 %d 个位置处的值是:%d \n\n", i, iTmpVal);
/*
/* 比较数据元素是否存在平方关系
*/
for (j = 3; j <= 4; j++)
{
k = LocateElem(t_SequentList, j, CompareSquare);
if (k)
{
printf("第 %d 个元素的值为 %d。是 %d 的平方! \n", k, t_SequentList.piElem[k-1], j);
}
else
{
printf("没有值为 %d 的平方的元素! \n\n", j);
}
}
/*
/* 测试头两个数据
*/
printf("调用前驱元素判断函数后:\n");
for (j = 1; j <= 2; j++)
{
GetElem(t_SequentList, j, &iRearElem); // 把第 j 个数据赋给 iTmpElem1
i = PriorElem(t_SequentList, iRearElem, &iFrontalElem); // 求 iTmpElem1 的前驱
if (INFEASIBLE == i)
{
printf("元素 %d 无前驱! \n", iRearElem);
}
else
{
printf("元素 %d 的前驱为:%d \n\n", iRearElem, iFrontalElem);
}
}
/*
/* 测试后两个数据
*/
k = ListLength(t_SequentList);
printf("调用后继元素判断函数后:\n");
for (j = k - 1; j <= k; j++)
{
GetElem(t_SequentList, j, &iFrontalElem); // 把第 j 个数据赋给 iTmpElem1
i = NextElem(t_SequentList, iFrontalElem, &iRearElem); // 求 iTmpElem1 的后继
if (INFEASIBLE == i)
{
printf("元素 %d 无后继! \n\n", iFrontalElem);
}
else
{
printf("元素 %d 的后继为:%d \n", iFrontalElem, iRearElem);
}
}
/*
/* 删除顺序线性链表
中最后及其后面的元素
*/
printf("删除顺序线性链表中最后一个元素,及该元素后面的元素:\n");
k = ListLength(t_SequentList);
for (j = k + 1; j >= k; j--)
{
i = DeleteElem(&t_SequentList, j, &iTmpVal);
if (ERROR == i)
{
printf("删除第 %d 个数据失败! \n", j);
}
else
{
printf("删除的元素值为:%d \n\n", iTmpVal);
}
}
/*
/* 遍历顺序线性链表并输出所有元素
*/
printf("调用元素遍历函数并依次输出线性表的元素:\n");
TraverseList(t_SequentList, VisitElem);
printf("\n\n");
/*
/* 将顺序线性链表中的所有元素加倍并输出
/*
/* 利用 TraverseList(T_SeqList t_pSList, void (*)(ElemType *)) 函数中,
/* void (*)(ElemType *) 函数所带来的函数多态特性(关键在于该函数名“未定”),
/* 依次把 DoubleElem(ElemType *) 和 VisitElem(ElemType *) 函数
/* 作为函数 TraverseList() 的第 2 个参数加以调用
*/
printf("调用元素加倍函数并依次输出线性表的元素:\n");
TraverseList(t_SequentList, DoubleElem); // 函数多态性之一
TraverseList(t_SequentList, VisitElem); // 函数多态性之二
printf("\n\n");
/*
/* 销毁顺序线性链表
*/
i = DestroyList(&t_SequentList);
if (OK == i)
{
printf("调用销毁函数后,顺序线性链表销毁成功!\n");
printf("目前该链表中有 %d 个元素,共 %d 个存储空间 \n\n", t_SequentList.iLength, t_SequentList.iListSize);
}
}