链表
来源:互联网 发布:淘宝收货货款冻结15天 编辑:程序博客网 时间:2024/05/16 14:29
一开始学习数据结构,老师就教我们数据抽象,把要实现的函数用接口封装起来
我是这样做的
首先把要申明的函数放在setting.h这个头文件里面
然后在main.cpp里面写自己要调用的函数
operation.cpp、
里面定义函数,是具体的实现细节
举个例子(以链表为例)各个操作基本实现了,作为参考
/*****************************************************************************************/
setting.h
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status intiList(LinkList &);
Status Visit(ElemType);
Status insertList(LinkList &,int ,ElemType );
Status printList(LinkList &);
Status ListTravel(LinkList ,Status(*a)(ElemType ));
Status ListDelete(LinkList ,int ,ElemType & );
Status GetElem_L(LinkList ,int &,ElemType &);
Status NextElem_L(LinkList ,ElemType ,ElemType &);
Status PriorElem_L(LinkList ,ElemType ,ElemType &) ;
Status ListInsert_L(LinkList &,int ,ElemType );
Status LengthList(LinkList &,int & );
void welcome();
void pChar(char achar,int n);
void paintLine(char achar);
void paintLBorder (char achar,int n);
void paintRBorder (char achar,int n);
void paintBorder (char achar);
void paintString (char achar,char* string);
void paintChars(char* chars,int n);
void anyKey (char* mess);
void showAbout();
void showLogo();
int showGUI();
void exit(int* isContinue);
Status LocateElem_L(LinkList ,ElemType ,Status (*)(ElemType,ElemType));
Status Equal_L(ElemType,ElemType);
void Union(LinkList &,LinkList );
void Developer();
void Wrong() ;
/*****************************************************************************************/
main.cpp
#include "setting.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "stdio.h"
void main()
{
showAbout();
int i,j,k,n;
ElemType e;
e = 2,k = 6;
LinkList La,Lb;
int* isContinue=NULL;
LinkList L;
intiList(L);
printf("/n");
printf("/n");
welcome();
for (scanf("%d",&j);j!=0;system("cls"),welcome(),scanf("%d",&j))
{
switch(j)
{
case 1:
printf("the Length : ");
scanf("%d",&n);
printf("please input your datas:");
for(i=1;i<=n;i++)
{
scanf("%d",&e);
insertList(L,i,e);
}
printf("now your LinkList is :");
ListTravel( L,Visit);
printf("/n");
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 2:
printf("the Location your need to delete:");
printf(" ");
scanf("%d",&i);
ListDelete(L,i,e);
printf("Now the LinkList is :");
ListTravel(L,Visit);
printf("/n");
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 3:
printf("insert a data into your LinkList/n");
printf("please select the Location:");
scanf("%d",&i);
printf("input the data :");
scanf("%d",&e);
ListInsert_L(L,i,e);
printf("now the LinkList is :");
printList(L);
printf("/n");
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 4:
printf("please input data that has exist in LinkList :");
scanf("%d",&i);
GetElem_L(L,i,e);
printf("the priorelem is:");
printf("%d/n",e);
printf("/n");
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 5:
printf("please input data that has exist in LinkList:");
scanf("%d",&i);
NextElem_L(L,i,e);
printf("the Nextelem is:");
printf("%d/n",e);
getchar();printf("/n按回车返回主菜单/n");getchar();
break;
case 6:
printf("the Length of the LinkList is:");
LengthList(L,k);
printf("%d/n",k);
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 7:
printf("创建的链表La是:");
intiList(La);
for(i = 0;i < 5;i++)
{
ListInsert_L(La,i+1,e);
e=e+2;
}
n = LengthList(La,i);
ListTravel(La,Visit);
printf("/n");
intiList(Lb);
for(j = 0;j < 5;j++)
{
ListInsert_L(Lb,j+1,k);
k = k+2;
}
printf("创建的链表Lb是:");
ListTravel(Lb,Visit);
printf("/n");
Union(La,Lb);
printf("La和Lb的链表集合是:");
ListTravel(La,Visit);
printf("/n");
getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 8:
Developer(); getchar();printf("/n按回车返回主菜单:/n");getchar();
break;
case 9:
exit (isContinue);
printf("/n");
break;
default:
Wrong(); getchar();printf("/n按回车返回主菜单:/n");getchar();
}
}
}
/*****************************************************************************************/
operation.cpp
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "stdio.h"
#include "setting.h"
/*-----------------------------------------------------以下为华丽分割线-----------------------------------------------------------*/
void pChar(char achar,int n){
for (int i=0;i<n;i++)
printf ("%c",achar);
}
void paintLine(char achar){
pChar('/0',20);
pChar(achar,40);
pChar('/0',20);
}
void paintLBorder (char achar,int n){
pChar('/0',20);
pChar(achar,1);
pChar('/0',n);
}
void paintRBorder (char achar,int n){
pChar ('/0',n);
pChar(achar,1);
pChar('/0',20);
}
void paintBorder (char achar){
paintLBorder (achar,0);
pChar ('/0',38);
paintRBorder (achar,0);
}
void paintString (char achar,char* string){
int n=(38-strlen(string))/2;
paintLBorder(achar,n);
printf ("%s",string);
paintRBorder (achar,n);
}
void paintChars(char* chars,int n){
for (int i=0;i<n;i++)
printf ("%s",chars);
}
void anyKey (char* mess){
printf ("%s",mess);
getch();
}
void showAbout(){
system("cls");
pChar('/n',5);
paintLine('*');
paintBorder('*'); /*显示欢迎界面*/
paintString ('*',"何涛作品");
paintBorder('*');
paintString ('*',"链表管理系统");
paintBorder ('*');
paintBorder ('*');
paintString ('*',"Copyright(c) 2009,7-10");
paintString ('*',"All Right Reserved");
paintLine('*');
pChar ('/n',3);
pChar ('/0',43);
anyKey ("按任意键继续....");
system("cls");
}
void exit(int* isContinue){ /*对应主菜单选项5的函数*/
int tu;
pChar ('/n',5);
pChar ('/0',24);
printf ("确定退出(0-退出,1-返回主菜单)?");
scanf ("%d",&tu);
if (tu==0)
{
printf("ByeBye!");
printf("/n");
exit(0);
system("cls");
}
}
/*-----------------------------------------------------以上为华丽分割线-----------------------------------------------------------*/
Status intiList(LinkList &L)
{
L=(LinkList)malloc(sizeof LNode);
L->next =NULL;
if(!L)
return OVERFLOW;
return 1;
}
Status insertList(LinkList &L,int i,ElemType e)
{
LinkList p,q;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next ;
++j;
}
if(!p) return 0;
else
q=(LinkList)malloc(sizeof LNode);
q->data=e;
q->next=p->next;
p->next=q;
return 1;
}
Status printList(LinkList &L)
{
LinkList p;
p=L->next;
while(p)
{
printf("%d",p->data);
printf(" ");
p=p->next;
}
printf("/n");
return 1;
}
Status ListTravel(LinkList L,Status(*a)(ElemType) )
{
LinkList p;
p=L->next ;
while(p)
{
a(p->data);
p=p->next;
}
return 1;
}
Status Visit(ElemType e)
{
printf("%d",e);
return 1;
}
ListDelete(LinkList L,int i,ElemType &e)
{
int j=0;
LinkList q,p;
p=L;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return 0;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return 1;
}
Status GetElem_L(LinkList L,int &i,ElemType &e)
{
int j=1;
LinkList p;
p=L->next ;
while(p&&j<i)
{
p=p->next ;
++j;
}
if(!p||j>i)
return 0;
e=p->data ;
return 1;
}
Status NextElem_L(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList p;
p=L;
while(p->next && p->data !=cur_e)
p=p->next ;
next_e=p->next ->data ;
return 1;
}
Status PriorElem_L(LinkList L,ElemType cur_e,ElemType &prior_e)
{
int j=1,i=1;
LinkList p;
p=L->next ;
while(p->data !=cur_e)
{
p=p->next ;
++i;
}
p=L->next ;
while(j<i-1)
{
p=p->next ;
++j;
}
if(!p||j>i)
return 0;
prior_e=p->data ;
return 1;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
int j=0;
LinkList p,s;
p=L;
while(p&&j<i-1)
{
p=p->next ;
++j;
}
if(!p||j>i-1)
return 0;
s=(LinkList)malloc(sizeof(LNode));
s->data =e;
s->next =p->next;
p->next =s;
return 1;
}
Status LengthList ( LinkList &L, int &i )
{
LinkList p;
p = L -> next;
i=0;
while(p!=NULL)
{
p=p->next;
++i;
}
return i;
}
Status LocateElem_L(LinkList L,ElemType e,Status (*compare)(ElemType a,ElemType b))
{
int i;
LinkList p;
p = L->next ;
while(p && !compare(e,p->data ))
{
p = p->next ;
++i;
}
if(!p)
return ERROR;
else
return OK;
}
Status Equal_L(ElemType a,ElemType b)
{
if(a == b)
return OK;
else
return ERROR;
}
void Union(LinkList &La,LinkList Lb)
{
int i,Eb,La_Len,Lb_Len;
La_Len = LengthList(La,i);
Lb_Len = LengthList(Lb,i);
for(i = 1;i <= Lb_Len;i++)
{
GetElem_L(Lb,i,Eb);
if(!LocateElem_L(La,Eb,Equal_L))
ListInsert_L(La,++La_Len,Eb);
}
}
void Developer()/*显示该软件制作人员*/
{
printf("/n/n/n/t/t/t/t/t制作人员:/n/t/t/t/t/t/t ------何·涛/n/n/n");
}
void Wrong()
{
printf("/n=====>tips:error!/n");
}
void welcome()
{
pChar ('/n',3);
paintLine ('*');
paintString('#',"1.初始化: ");
paintString('#',"2.删除操作 ");
paintString('#',"3.插入操作 ");
paintString('#',"4.前去操作 ");
paintString('#',"5.后置操作 ");
paintString('#',"6.计算长度 ");
paintString('#',"7.链表联合 ");
paintString('#',"8.制作人员 ");
paintString('#',"9.退出程序 ");
paintLine ('*');
pChar ('/n',3);
pChar ('/0',34);
printf(" please select:");
}