//Function realization.cpp
#include "predefined.h"
#include"lianshijiegou.h"
//----线性表的动态分配链式存储结构函数实现---------
Status InitList_L(LinkList *L)//构造一个带头结点的空线性表
{
(*L)=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
(**L).next=NULL;
(**L).data=0;
return OK;
}
Status DestroyList_L(LinkList *L)//销毁线性表
{
LinkList p,q;
p=*L;
while(p)
{
p=(**L).next;
free(*L);
(*L)=p;
}
return OK;
}
Status ClearList_L(LinkList *L)//重置线性表为空表,保留头结点
{
LinkList p,q;
p=*L;
if(!p) return FALSE;
p=(*p).next;
while(!p)
{
q=p;
p=(*p).next;
free(q);
}
(**L).next=NULL;
return OK;
}
Status ListEmpty_L(LinkList L)//若为空表,返回TRUE,否则返回FALSE
{
if(!((*L).next)&&L!=NULL) return TRUE;
else return FALSE;
}
Status ListLength_L(LinkList L)//返回表中数据个数
{
ElemType n=0;
LinkList p;
p=L;
while(p=(*p).next) n++;
return n;
}
Status GetElem_L(LinkList L,int i,ElemType *e)//L为带头结点的单链表的头指针。
//算法2.8:当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
{
LinkList p;
int j=1;
p=(*L).next;
while(p&&j<i)
{
p=(*p).next;
++j;
}
if(!p||j>i) return ERROR;
*e=(*p).data;
return OK;
}
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))
//返回L中第一个与e满足关系compare数据元素的位序。若这样的数据元素不存在,则返回0。
{
LinkList p;
p=(*L).next;
Status n;
n=compare(p,e);
if(n) return n;
else return FALSE;
}
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)
//若cur_e是L的数据元素,且不是第一个,则用e返回它的前驱,否则操作失败
{
LinkList p=(*L).next;
Status n;
n=LocateElem_L(L,cur_e,equal);
if(n==1||n==0) return FALSE;
for(int i=2;i<n;i++)
{
p=(*p).next;
}
*pre_e=(*p).data;
return OK;
}
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)
//若cur_e是L的数据元素,且不是最后一个,则用e返回它的后继,否则操作失败
{
LinkList p=(*L).next;
while((*p).next!=NULL)
{
if((*p).data==cur_e)
{
*next_e=(*(*p).next).data;
return OK;
}
else p=(*p).next;
}
return FALSE;
}
Status ListInsert_L(LinkList *L,int i,ElemType e)
//算法2.9:在带头结点的单链表L中第i个位置之前插入元素e。
{
LinkList p,q;
p=*L;
if(i<1||i>ListLength_L(*L)+1) return FALSE;
for(int j=1;j<i;j++)
{
p=(*p).next;
}
q=(LinkList)malloc(sizeof(LNode));
(*q).data=e;
(*q).next=(*p).next;
(*p).next=q;
return OK;
}
Status ListDelete_L(LinkList *L,int i,ElemType *e)
//算法2.10:在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
{
LinkList p,q;
p=*L;
for(int j=1;j<i;j++)
{
p=(*p).next;
}
*e=(*(*p).next).data;
q=(*p).next;
(*p).next=(*(*p).next).next;
free(q);
return OK;
}
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L))
//依次对L中每个元素调用visit函数。
{
LinkList p;
Status m;
p=(*L).next;
while(p!=NULL)
{
m=visit(p);
if(m) p=(*p).next;
else return FALSE;
}
return OK;
}
void CreatList_L(LinkList *L,int n)
//算法2.11逆位序输入n个元素的值,建立带头结点的单链表L。
{
(*L)=(LinkList)malloc(sizeof(LNode));
if(!L) exit(OVERFLOW);
(**L).next=NULL;
(**L).data=0;
LinkList p;
for(int i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("▼请输入第%d个数: ",i);
scanf("%d",&(*p).data);
(*p).next=(**L).next;
(**L).next=p;
}
}
//main.cpp
#include "predefined.h"
#include"lianshijiegou.h"
Status equal(LinkList L,ElemType e)
{
int i;
for(i=1;;i++)
{
if((*L).data==e) return i;
else if((*L).next==NULL) return 0;
else L=(*L).next;
}
}
Status visit(LinkList L)
{
printf("%d ",(*L).data);
return OK;
}
int main()
{
LinkList La,Lb,Lc;
Status s;
int n,m,i;
ElemType e;
printf("Function 1\n★函数 InitList_L(LinkList *L)测试...\n");
s=InitList_L(&La);
printf("▲初始化单链表La: %d (0:失败 1:成功)\n\n",s);
printf("Function 2\n★函数 ListEmpty_L(LinkList L)测试...\n");
s=ListEmpty_L(La);
printf("▲表La是否为空表: %d (0:否 1:是)\n\n",s);
printf("Function 3\n★函数 ListInsert_L(LinkList *L,int i,ElemType e)测试...\n");
printf("▲请输入准备向La输入的个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("▲请输入La第%d个数:",i);
scanf("%d",&m);
s=ListInsert_L(&La,i,m);
printf("▲插入成功?:%d (1:成功 0:失败)\n",s);
}
printf("\n");
printf("Function 4\n★函数 ListTraverse_L(LinkList L,Status (*visit)(LinkList L))测试...\n");
printf("▲La中的元素为:La={");
ListTraverse_L(La,visit);
printf("}\n\n");
printf("Function 5\n★函数 ListLength_L(LinkList L)测试...\n");
s=ListLength_L(La);
printf("▲La的长度为:%d\n\n",s);
printf("Function 6\n★函数 ListDelete_L(LinkList *L,int i,ElemType *e)测试...\n");
ListDelete_L(&La,3,&e);
printf("▲删除La中第3个元素:\"%d\"\n",e);
printf("▲La中的元素为:La={");
ListTraverse_L(La,visit);
printf("}\n\n");
printf("Function 7\n★函数 GetElem_L(LinkList L,int i,ElemType *e)测试...\n");
GetElem_L(La,3,&e);
printf("▲La中第三个位置元素为 \"%d\"\n\n",e);
printf("Function 8\n★函数 LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e))测试...\n");
s=LocateElem_L(La,6,equal);
printf("▲La中第一个等于元素\"6\"的位置为 %d\n\n",s);
printf("Function 9\n★函数 PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e)测试...\n");
PriorElem_L(La,5,&e);
printf("▲La中元素\"5\"的前驱为 %d\n\n",e);
printf("Function 10\n★函数 NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e)测试...\n");
NextElem_L(La,5,&e);
printf("▲La中元素\"5\"的后继为 %d\n\n",e);
printf("Function 11\n★函数 CreatList_L(LinkList *L,int n)测试...\n");
printf("▲请输入准备向Lb输入的个数:");
scanf("%d",&n);
CreatList_L(&Lb,n);
printf("▲Lb中的元素为:Lb={");
ListTraverse_L(Lb,visit);
printf("}\n\n");
printf("Function 12\n★函数 MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)测试...\n");
MergeList(&La,&Lb,&Lc);
printf("▲Lc中的元素为:Lc={");
ListTraverse_L(Lc,visit);
printf("}\n\n");
printf("Function 13\n★函数 ClearList_L(LinkList *L)测试...\n");
printf("▲Lc清空前 :");
ListEmpty_L(Lc)?printf("表Lc为空!!!\n"):printf("表Lc非空!!!\n");
ClearList_L(&Lc);
printf("▲Lc清空后 :");
ListEmpty_L(Lc)?printf("表Lc为空!!!\n\n"):printf("表Lc非空!!!\n\n");
printf("Function 14\n★函数 DestroyList_L(LinkList *L)测试...\n");
printf("▲Lc销毁前 :");
Lc?printf("表Lc存 在!!!\n"):printf("表Lc不存在!!!\n");
DestroyList_L(&Lc);
printf("▲Lc销毁后 :");
Lc?printf("表Lc存 在!!!\n\n"):printf("表Lc不存在!!!\n\n");
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
//算法2.12:已知线性表La和Lb中的数据元素按值非递减排列。
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列。
{
LinkList pa,pb,pc;
pa=(**La).next; //指向表a第一个元素
pb=(*Lb)->next;
*Lc=pc=*La; //用La的头结点作为Lc的头结点
int i=1;
while(pa&&pb)
{
if((*pa).data<=(*pb).data)
{
(*pc).next=pa;
pc=(*pc).next;
pa=(*pa).next;
}
else
{
(*pc).next=pb;
pc=(*pc).next;
pb=(*pb).next;
}
}
(*pc).next=pa?pa:pb;
free(*Lb);
}
//lianshijiegou.h
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList_L(LinkList *L);
Status DestroyList_L(LinkList *L);
Status ClearList_L(LinkList *L);
Status ListEmpty_L(LinkList L);
Status ListLength_L(LinkList L);
Status GetElem_L(LinkList L,int i,ElemType *e);
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(LinkList L,ElemType e));
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType *pre_e);
Status NextElem_L(LinkList L,ElemType cur_e,ElemType *next_e);
Status ListInsert_L(LinkList *L,int i,ElemType e);
Status ListDelete_L(LinkList *L,int i,ElemType *e);
Status ListTraverse_L(LinkList L,Status (*visit)(LinkList L));
void CreatList_L(LinkList *L,int n);
Status equal(LinkList L,ElemType e);
Status visit(LinkList L);
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc);
//predefined.h
#include "stdio.h"
#include "stdlib.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;
注意:二极指针的使用, scanf("%d",&a)。