本程序在CodeBlocks运行通过,博客结尾附有下载链接。
在main.c中需要调用func2-2.h头文件。
注:由于在main.c中要打印一些特殊类型的数据,为了不频繁使用printf()函数,所以在func2-2.h中定了了一些print()用户自定义函数,方便进行数据的比较与打印等等操作。
func2-2.h
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
Status equal(ElemType e1,ElemType e2)
{//判断是否相等函数
if(e1 == e2)
return OK;
else
return FALSE;
}
int com(ElemType e1,ElemType e2)//返回值是int型
{//根据a<、=或>b,分别返回-1、0或1
if(e1 == e2)
return 0;
else
return (e1 - e2)/ (abs(e1 - e2));
}
void print(ElemType e)
{//以十进制整型的格式输出元素的值
printf("%d",e);
}
void print1(ElemType &e)
{//以十进制整型的格式输出元素的值(设C为引用类型)
printf("%d ",e);
}
void print2(ElemType e)
{//以字符型的格式输出元素的值
printf("%c",e);
}
main.c
#include <stdio.h>
#include <malloc.h>
#include "func2-2.h"
#include <stdlib.h>
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LIST_INCREMENT 10
#define N 10
typedef struct
{
ElemType *elem;//elem为指针变量,存储的是顺序表L的基地址
int length;
int listsize;
}Sqlist;
//func2-2函数调用声明
void print1(ElemType &e);
Status equal(ElemType e1,ElemType e2);
//本文件函数声明
void InitSqlist_Sq(Sqlist &L);
void Destroy_Sq(Sqlist &L);
void Clear_Sq(Sqlist &L);
Status ListEmpty_Sq(Sqlist L);
int ListLength_Sq(Sqlist L);
Status GetElem_Sq(Sqlist L,int i,ElemType &e);
int Locate_Sq(Sqlist L,ElemType e,Status (* compare)(ElemType,ElemType));//compare()函数
Status PriorElem_Sq(Sqlist L,ElemType cur_e,ElemType &pre_e);
Status NextElem_Sq(Sqlist L,ElemType cur_e,ElemType &next_e);
Status ListInsert_Sq(Sqlist &L,int i,ElemType e);
Status ListDelete_Sq(Sqlist &L,int i,ElemType &e);
Status ListTraverse_Sq(Sqlist L,void(* visit)(ElemType &e));
//主函数
int main()
{
Sqlist L;
int e,e1,i,j,k,m,pre_e,next_e,ins_e,del_e;
//Status flag;
InitSqlist_Sq(L);
printf("初始化L表后,L.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);//%p用于输出L.elem在内存中的地址
for(i = 1; i <= N; i++)
ListInsert_Sq(L,1,i);
printf("L表中的元素为:");
ListTraverse_Sq(L,print1);
printf("请输入需要查询L表中第j个元素(1<=j<=%d):",L.length);
scanf("%d",&j);
while(j<1 || j>L.length)
{
printf("超出范围!请重新输入!\n");
printf("请输入需要查询L表中第j个元素(1<=j<=%d):",L.length);
scanf("%d",&j);
}
GetElem_Sq(L,j,e);
printf("L表中第%d个元素的值为:%d\n",j,e);
printf("查询L表中第几个元素的前一个元素[2,%d]:",L.length);
scanf("%d",&j);
while(j<2 || j>L.length)
{
printf("超出范围!请重新输入!\n");
printf("查询L表中第几个元素的前一个元素[2,%d]:",L.length);
scanf("%d",&j);
}
GetElem_Sq(L,j,e);
PriorElem_Sq(L,e,pre_e);
printf("第%d个元素为%d,它的前一个元素是:%d\n",j,e,pre_e);
printf("查询L表中第几个元素的后一个元素[1,%d]:",L.length-1);
scanf("%d",&j);
while(j<1 || j>L.length-1)
{
printf("超出范围!请重新输入!\n");
printf("查询L表中第几个元素的后一个元素[1,%d]:",L.length-1);
scanf("%d",&j);
}
GetElem_Sq(L,j,e);
NextElem_Sq(L,e,next_e);
printf("第%d个元素为%d,它的后一个元素是:%d\n",j,e,next_e);
printf("请输入想要在L中匹配的数:",e1);
scanf("%d",&e1);
k = Locate_Sq(L,e1,equal);
if(k)//k不为零,说明L中存在与e1匹配的数
printf("第%d个数与%d匹配!\n",k,e1);
else//否则说明不存在与e1匹配的数
printf("L中不存在与%d匹配的数!\n",e1);
printf("请输入在第几个元素之前插入[1,%d]:",L.length+1);
scanf("%d",&j);
while(j<0 || j>L.length+1)
{
printf("超出范围!请重新输入!\n");
printf("请输入在第几个元素之前插入[1,%d]:",L.length+1);
scanf("%d",&j);
}
printf("输入将要插入的元素:");
scanf("%d",&ins_e);
printf("在第%d个元素之前插入元素%d\n",j,ins_e);
ListInsert_Sq(L,j,ins_e);
printf("插入元素后,L表为:");
ListTraverse_Sq(L,print1);
printf("请输入要删除第几个元素?m = ");
scanf("%d",&m);
while(m<1 || m>L.length)
{
printf("超出范围,请重新输入:\n");
printf("请输入要删除第几个元素?m = ");
scanf("%d",&m);
}
printf("删除第%d个元素\n",m);
if(ListDelete_Sq(L,m,del_e))
{
printf("删除元素为:%d\n",del_e);
printf("删除元素成功!\n");
}
printf("删除元素之后,L表为:");
ListTraverse_Sq(L,print1);
printf("清空前,L表信息为:L.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
Clear_Sq(L);
printf("顺序表L已经被清空!\nL.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
Destroy_Sq(L);
printf("顺序表L已经被销毁!\nL.length = %d, L.listsize = %d, L.elem = %p\n",L.length,L.listsize,L.elem);
return 0;
}
//函数实现
void InitSqlist_Sq(Sqlist &L)
{
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return;
}
void Destroy_Sq(Sqlist &L)
{
free(L.elem);
L.elem = NULL;
L.length = 0;
L.listsize =0;
}
void Clear_Sq(Sqlist &L)
{
L.length = 0;//不是int L.length = 0,直接令L.length = 0即可
}
Status ListEmpty_Sq(Sqlist L)
{
if(L.length == 0)
return OK;//注意:在程序中,返回用OK-ERROR组合和TRUE-FALSE组合都可以,根据语境进行判断
else
return ERROR;
}
int ListLength_Sq(Sqlist L)
{
return L.length;
}
Status GetElem_Sq(Sqlist L,int i,ElemType &e)
{
if(i<1||i>L.length)
return ERROR;
e = *(L.elem + i - 1);//等价于 e = L.elem[i-1];
return OK;
}
int Locate_Sq(Sqlist L,ElemType e,Status (* compare)(ElemType,ElemType))//compare()函数
{
int i = 1;
ElemType *p = L.elem;
while( i<=L.length && !compare(*(p++),e))//重要:在这一行,*(p++) = *p++;
i++;
if(i<=L.length)
return i;
else
return 0;
}
Status PriorElem_Sq(Sqlist L,ElemType cur_e,ElemType &pre_e)
{
int i = 2;
ElemType *p = L.elem + 1;
while(i<=L.length && *p != cur_e)//注意这儿是while循环,不是if判断语句
{
p++;
i++;
}
if(i>L.length)
return ERROR;
else
{
pre_e = *(--p);//等价于pre_e = * --p;
return OK;
}
}
Status NextElem_Sq(Sqlist L,ElemType cur_e,ElemType &next_e)
{
int i = 1;
ElemType *p = L.elem;
while(i<L.length && *p != cur_e)//寻找后继元素,i的范围需要小于表长,最大只能到达倒数倒数第二个,因此不能写 i<=L.length
{ //注意这儿是while循环,不是if判断语句
p++;
i++;
}
if(i==L.length)//i = L.length的时候就结束了上边的if-else循环,此时i = L.length
return ERROR;
else
{
next_e = *(++p);//等价于next_e = * ++p;
return OK;
}
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)
{
ElemType *newbase,*p,*q;
if(i<1 || i>L.length+1)//这条语句说明也可以在表尾插入一个元素
return ERROR;
if(L.listsize == L.length)
{
newbase = (ElemType *)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
if(!newbase)//!newbase 等价于 NULL == newbase
return ERROR;
L.elem = newbase;
L.listsize += LIST_INCREMENT;
}
p = L.elem + i - 1;//把第i个元素的地址存到p中
for(q=L.elem+L.length-1; q>=p; q--)
*(q+1) = *q;
*p = e;
++L.length;
return OK;
}
Status ListDelete_Sq(Sqlist &L,int i,ElemType &e)
{
ElemType *p;
if(i<1 || i>L.length)
return ERROR;
e = *(L.elem + i - 1);
for(p = L.elem + i - 1; p <= L.elem + L.length - 1; p++)
*p = *(p+1);
L.length--;
return OK;
}
Status ListTraverse_Sq(Sqlist L,void(* visit)(ElemType &e))
{
ElemType *p = L.elem;
int i;
for(i = 1; i <= L.length; i++)
visit(*p++);
printf("\n");
return OK;
}
源码:http://download.csdn.net/detail/u013383042/9623543
原创:http://blog.csdn.net/u013383042/article/details/52453320