①将函数结果状态声明写在status.h包内
#ifndef STATUS_H
#define STATUS_H
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#endif
②将函数声明写在list.h包内
#ifndef LIST_H
#define LIST_H
#include "status.h"
typedef struct Node
{
ElemType data;
int length;
struct Node *next;
}Node;
typedef struct Node *LinkList;
Status InitList (LinkList *L);
int ListLength(LinkList L);
int IsEmpty(LinkList L);
int GetElem(LinkList L,int i,ElemType *e);
int LocateELem(LinkList L,ElemType e);
Status ListInsert(LinkList *L,int i,ElemType e);
Status ListDelete(LinkList *L,int i,ElemType *e);
#endif
③将函数的定义写在list.c包内
#include <stdio.h>
#include "list.h"
Status InitList(LinkList *L)
{
*L=(LinkList *)malloc(sizeof(LinkList));
if(L==NULL)
return ERROR;
(*L)->length=0;
(*L)->next=NULL;
return OK;
}
int ListLength(LinkList L)
{
return (*L).length;
}
int IsEmpty(LinkList L)
{
if((*L).length==0)
return TRUE;
else
return FALSE;
}
int GetElem(LinkList L,int i,ElemType *e)
{
int j=1;
LinkList p=L;
if(L->length==0||i<1||i>(L->length)) {
printf("===============");
return ERROR;
}
for(j=0;j<i;j++)
p=p->next;
*e=p->data;
return OK;
}
int LocateELem(LinkList L,ElemType e)
{
LinkList p=L;
int i;
if (L->length==0)
return ERROR;
p=L->next;
for(i=0;i<L->length;i++)
{
if (p->data==e)
break;
p=p->next;
}
if(i==p->length)
return ERROR;
return i+1;
}
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j=1;
LinkList p,s;
p = *L;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i)
return ERROR;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
(*L)->length++;
return OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j=1;
LinkList p;
p = *L;
while (p->next && j < i)
{
p = p->next;
j++;
}
if (!(p->next) || j > i)
return ERROR;
*e = p->next->data;
p->next = p->next->next;
(*L)->length--;
return OK;
}
将main函数实现线性表的功能写在listMain.c包内
#include "list.h"
#include <stdio.h>
int main()
{
LinkList lists,p;
ElemType value;
int t,i,n,site;
printf("==================构造空线性表==================");
t=InitList(&lists);
if(t==OK)
{
printf("\n线性表长度为:%d\n",lists->length);
}
printf("==================求线性表长度==================");
printf("\n此时线性表的长度为:%d\n",ListLength(lists));
printf("==================判断线性表是否为空==================");
t=IsEmpty(lists);
if(t==TRUE)
printf("\n此时线性表为空\n");
else
printf("\n此时线性表并不为空\n");
printf("==================为线性表添加数据,创建链表==================");
printf("\n请输入你要添加数据的个数:");
scanf("%d",&n);
printf("请依次输入%d个数据:",n);
for(i=1;i<=n;i++)
{
scanf("%d",&value);
ListInsert(&lists,i,value);
}
printf("插入数据后的线性表中的数据为:");
p=lists->next;
for(i=0;i<lists->length;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n==================在线性表第i位置插入元素==================");
printf("\n请输入你要插入元素的位置和所要插入的数:");
scanf("%d %d",&site,&value);
ListInsert(&lists,site,value);
printf("插入数据后的线性表中的数据为:");
p=lists->next;
for(i=0;i<lists->length;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n==================删除线性表中第i位置的元素,并返回所删除的元素==================");
printf("\n请输入你要删除元素的位置:");
scanf("%d",&site);
t=ListDelete(&lists,site,&value);
if(t==ERROR)
printf("你删除的数不在范围子内");
else
{
printf("你删除的第%d个元素的值为:%d\n",site,value);
printf("删除数据后的线性表中的数据为:");
p=lists->next;
for(i=0;i<lists->length;i++)
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n==================获取线性表第i位置的元素==================");
printf("\n请输出你要获取元素的位置:");
scanf("%d",&site);
t=GetElem(lists,site,&value);
if(t==ERROR)
printf("你输入的获取元素的位置不正确");
else
printf("你所获取的第%d个元素为:%d",site,value);
printf("\n==================查询数据元素value,返回其位置==================");
printf("\n请输入你要查询的数据:");
scanf("%d",&value);
t=LocateELem(lists,value);
if(t==ERROR)
printf("抱歉,未找到查询结果");
else
printf("你所查询的元素“%d”已找到,位置为:%d\n",value,t);
}
最终结果案例展示: