链表

来源:互联网 发布:淘宝收货货款冻结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:");
 
 
}