Asp.net 学习资料

伦惠峰

链表

#include<iostream.h>
struct LNode
{
 int data;
 LNode *next;
};
 
void InsertRear(LNode *&HL,const int &item)
{
       LNode *newptr;
       newptr=new LNode;
       newptr->data=item;
       newptr->next=NULL;
       if(HL==NULL)
              HL=newptr;
       else{
              LNode *p=HL;
              while(p->next!=NULL)
                     p=p->next;
              p->next=newptr;
       }
}
 
void InitList(LNode *&HL,int n)
{
  LNode *p1,*q;
  HL=p1=new LNode;
  for(int i=0;i<n;i++)
  {
   q=new LNode;
   cin>>q->data;
   HL->next=q;
   HL=q;
  }
  HL->next=NULL;
  HL=p1->next;
}
 
void InitList2(LNode *&HL,int n)
{
       HL=NULL;
    int num;
       for(int i=0;i<n;i++)
       {
              cin>>num;
        InsertRear(HL,num);
       }
}
 
 
 
void TraverseList(LNode *&HL)
{
 LNode *p=HL;
 while(p!=NULL)
 {
  cout<<p->data<<" ";
     p=p->next;
 }
 cout<<endl;
}
 
void CopyLink(LNode *&a,LNode *&b)//实现把a链表拷贝到b链表
{
       b=NULL;
       LNode *p=a;
       while(p!=NULL)
       {
              InsertRear(b,p->data);
              p=p->next;
       }
 
 
 
 
}
 
 
 
 
 
 
 
 
 
 
 
 
int delnum(LNode *&HL,int pos)
{
 int num=1;
 LNode *ap,*cp;
 ap=NULL;cp=HL;
 while(cp!=NULL)
 {
  if (num==pos) break;
  ap=cp;
  cp=cp->next;
  num++;
 }
 if(cp==NULL)
  HL=HL->next;
 else
  ap->next=cp->next;
 delete cp;
 return 1;
}
 
void DeSort(LNode *&HL)
{
 
 
if(HL==NULL) return;
LNode *p=HL->next;
LNode *pr=NULL;
 
 while (p!=NULL)
 {
 HL->next=pr;         
    pr=HL;
 HL=p;
 p=p->next; 
 }
 HL->next=pr;
}
 
void FindMax(LNode *&HL)
{
      
       LNode *p=HL;
       int max;
       max=p->data;
       while(p!=NULL)
       {
              if(max<(p->data)) max=p->data;
              p=p->next;
       }
       cout<<"最大的数是"<<max<<endl;
}
 
void LnodeNum(LNode *&HL,int x)//统计出单链表中的值等于x的个数
{
       int count=0;
    LNode *p=HL;
       while(p!=NULL)
       {
              if (x==p->data) count++;
              p=p->next;
       }
   cout<<"X的个数是"<<count<<"个"<<endl;
}
 
int LnodeNum(LNode *&HL)//求出结点个数
{
       int count=0;
    LNode *p=HL;
       while(p!=NULL)
       {
              count++;
              p=p->next;
       }
   return count;
}
 
 
void copy(LNode *&HL)
{
       int i=0;
       LNode *p=HL;
       int size=LnodeNum(HL); 
    int *List;
    List=new int[size];
    while(p!=NULL)
       {
              List[i]=p->data;
              i++;
              p=p->next;
       }
   
       cout<<"size="<<size<<endl;
    for (i=0;i<size;i++)
    {
          cout<<List[i]<<" "<<endl;
       }
 
}
 
void sort(LNode *HL)//链表用冒泡法
{
       int temp;
       LNode *p=HL;
       while(p!=NULL)
       {
              LNode *q=p->next;
              while (q!=NULL)
              {
                     if(p->data>=q->data)
                     {
                            temp=p->data;
                            p->data=q->data;
                            q->data=temp;
                     }
                     q=q->next;
                    
              }
              delete q;
              p=p->next;
       }
}
 
void add(LNode *&a,LNode *&b)
{
    LNode *p1=a;
      
       while(p1->next!=NULL)   //要想清楚,这里是p1->next,而不是p1.很容易出错。
       {
          p1=p1->next;
       }
 
       p1->next=b;
}
 
void addsort(LNode *&a,LNode *&b)//第七题,b链表覆盖了a链表
{
       add(a,b);
    sort(a);
}
 
void addsort2(LNode *&a,LNode *&b,LNode *&c)//第八题,产生派序后放在新的链表
 
{
CopyLink(a,c);
add(c,b);
sort(c);
}
 
 
 
void Devide(LNode *&c,LNode *&d,LNode *&e)
{
   LNode *p;
     d=e=NULL;
   p=c;
 
   while(p!=NULL)
   {
          if(p->data%2==0) InsertRear(d,p->data);
          else InsertRear(e,p->data);
          p=p->next;
   }
  
 
}
 
 
 
void main()
{
 LNode *a;
 int num,i;
 cout<<"请准备输入的原始数据的个数"<<endl;
 cin>>num;
 cout<<"********************************"<<endl;
 cout<<"请准备输入的原始数据"<<endl;
 InitList2(a,num);
 cout<<"初始数据输入完毕"<<endl;
 TraverseList(a);
 while(1)
 {
  cout<<"请选择你要的操作"<<endl;
  cout<<"1:逆序链接原链表:"<<endl;
  cout<<"2:删除第i个结点"<<endl;
  cout<<"3:找出最大值"<<endl;
  cout<<"4:统计出单链表中的值等于x的个数"<<endl;
  cout<<"5:根据一维数组建立一个对应的链表"<<endl;
  cout<<"6:对一个链表排序"<<endl;
  cout<<"7:把两个链表合成一个,并且排序,并且清空原来的链表"<<endl;
  cout<<"8:把两个链表合成一个,并且排序,放在新链表里面"<<endl;
  cout<<"9:把一个链表中的偶数和奇数分别放在两个新链表中:"<<endl;
  cout<<"10:遍历链表:"<<endl;
         cin>>i;
 
 while(i<1||i>10)
 {
   cout<<"请输入你的选择(1~10):";
   cin>>i;
}
cout<<endl;
switch(i)
{
  case 1:
      cout<<"逆序链接"<<endl;
      DeSort(a);
      break;
  case 2:
         cout<<"请输入要删除的第i个结点"<<endl;
         int x;
         cin>>x;
      delnum(a,x);
         break;
  case 3:
         cout<<"找出最大值"<<endl;
         FindMax(a);
         break;
  case 4:
         cout<<"请输入要统计的数是什么"<<endl;
         int y;
         cin>>y;
      LnodeNum(a,y);
  case 5:
         cout<<"根据一维数组建立一个对应的链表"<<endl;
         break;
  case 6:
      cout<<"链表排序"<<endl;
      sort(a);
         break;
  case 7:
      cout<<"请输入另外两个链表中的第一个的个数"<<endl;
         LNode *b;
         int num1;
         cin>>num1;
         InitList(b,num1);
      cout<<"请输入另外两个链表中的第二个的个数"<<endl;
       LNode *c;
          int num2;
        cin>>num2;
          InitList(c,num2);
       addsort(b,c);
       TraverseList(b);
          break;
  case 8:
         cout<<"请输入另外两个链表中的第一个的个数"<<endl;
         LNode *d;
         int num3;
         cin>>num3;
         InitList(d,num3);
      cout<<"请输入另外两个链表中的第二个的个数"<<endl;
       LNode *e;
          int num4;
        cin>>num4;
          InitList(e,num4);
       LNode *f;
          addsort2(d,e,f);
       TraverseList(f);
          break;
  case 9:
        
         LNode *g,*h;
      Devide(a,g,h);
         cout<<"偶数是"<<endl;
         TraverseList(g);
         cout<<"奇数是"<<endl;
         TraverseList(h);
         break;
  case 10:
    TraverseList(a);
       break;
        
 }
 
 
 
 }
 
 
}

posted on 2007-08-13 21:40  伦惠峰  阅读(284)  评论(0)    收藏  举报

导航