现在的位置: 首页 > 综合 > 正文

链式线性表源码

2013年09月17日 ⁄ 综合 ⁄ 共 3528字 ⁄ 字号 评论关闭

链式线性表源码 (c++)

#include "iostream.h"

#include "malloc.h" 

typedef  int  ElemType;
typedef  int  Status ;

//--------链式线性表定义--------
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

LNode    *p, *q;
LNode*    s;
LNode*    pa;
LNode*    pb;
LNode*    pc;

int j;
static int  num;

//---------------创建链表-----------------------
void CreateList_L(LinkList &L,int n)
{
////####逆位序输入n个元素的值,建立###带表头结点##的单链线性表L
   L=(LinkList)malloc(sizeof(LNode));
   L->next=NULL;
   for(int i=n;i>0;i--)
   {
p=(LinkList)malloc(sizeof(LNode));//-----
    cout<<"\n请输入第"<<i<<"个结点的值\t";
    cin>>(p->data);
    p->next=L->next;
    L->next=p;
   }
  cout<<endl;
}

//---------链式线性表中查找第i个结点的值------------
Status GetElem_L(LinkList L,int i, ElemType &e)

if(i<=0 || i>num)
  {
   cout<<"\t查找位置不合法!"<<endl;
   return 0;
  }//-------------------

   p=L->next;  ///------------------
     j=1;        ///------------------
   while(p&&j<i)
   {
    p=p->next;
    ++j;
   }

  if(!p||j>i)
   return 0;
   e=p->data;
   return 1;
  }
//------------------链式线性表 合并非递减有序链表---------
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
   //已知单链线性表La和Lb的元素按值非递减排列
   //归并La和Lb得到新的单链线表Lc,Lc的元素也按值非递减排列
pa=La->next;
pb=Lb->next;
Lc=pc=La;//用La头结点作为Lc的头结点
while(pa&&pb)
{
  if(pa->data <= pb->data)
  {
   pc->next=pa;
   pc=pa;
   pa=pa->next;
  }
  else
  {
      pc->next=pb;
   pc=pb;
            pb=pb->next;
  }
}
pc->next=pa?pa:pb;
free(Lb);
}

//--------------------链式线性表 插入-----------------

Status ListInsert_L(LinkList &L,int i,ElemType e)
{
   if(i<=0 || i>num+1)
  {
   cout<<"\t插入位置不合法!"<<endl;
   return 0;
  }//-------------------

  p=L;
  j=0;
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;
num++;//--------
return 1;
}

//--------------------链式线性表 删除-----------------
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
  if(i<=0 || i>num)
  {
   cout<<"\t删除位置不合法!"<<endl;
   return 0;
  }//-------------------
p=L;
j=0;
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);
num--;//--------
return 1;
}
//--------------------链式线性表 输出-----------------
void output(LinkList &L,int n) 
{  cout<<"\n\n当前各结点值为:"<<endl;
   p= L->next;
   for(int i=1;i<=n;i++)
   {
    cout<<"第"<<i<<"个结点的值为\t"<< (p->data)<<endl;
 
    p= p->next;
   }
}
//-------------主函数---------------
void main()
{      
     cout<<"\n\t======================链式线性表操作===========\n";
        cout<<"-------------------------初始化---------------------------"<<endl;
  cout<<"请输入初始时链接线性表中结点的个数"<<endl;
   cin>>num;
     LinkList L;
     CreateList_L( L, num);
     output(L,num);
 
 
  cout<<"--------------------------查找----------------------------"<<endl;
  int i;
  cout<<"请输入欲查找的结点所处的次序\t"<<endl;
  cin>>i;
     ElemType s;
  GetElem_L(L,i,s);
  cout<<"所查找的第"<<i<<"个结点的值为\t "<<s;
  output(L,num);//----
   
 
  cout<<"--------------------------插入----------------------------"<<endl;
  cout<<"请输入欲插入的结点所处的位置和相应的数值\n";
  cin>>i>>s;
     ListInsert_L(L,i,s);
  output(L,num);
    
 
  cout<<"--------------------------删除-----------------------------"<<endl;
     cout<<"请输入欲删除的结点所处的位置\t"<<endl;
     cin>>i;
     ListDelete_L(L,i,s);
     cout<<"所删除的元素位置为"<<i<<",其值为\t"<<s;
     output(L,num);  
 

     cout<<"----------------------合并非递减有序链表--------------------"<<endl;
     cout<<"\n请输入初始时 *非递减* 链式线性表 La 中结点的个数"<<endl;
     int num_La;
     cin>>num_La;
        LinkList La;
        CreateList_L( La, num_La);
   

     cout<<"\n请输入初始时 *非递减* 链式线性表 Lb 中结点的个数"<<endl;
     int num_Lb;
     cin>>num_Lb;
        LinkList Lb;
        CreateList_L( Lb, num_Lb);
        cout<<"\n La中"<<endl;
     output(La,num_La);
        cout<<"Lb中"<<endl;
     output(Lb,num_Lb);
     LinkList Lc;
     MergeList_L(La,Lb,Lc);
     num=num_La+num_Lb;
     cout<<"\n\n合并后 *非递减* 链式线性表Lc中"<<endl;
     output(Lc,num);

}

抱歉!评论已关闭.