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

之线性链表小结

2013年10月07日 ⁄ 综合 ⁄ 共 2973字 ⁄ 字号 评论关闭

#include <iostream>
#include <stdlib.h>
#include <malloc.h>
typedef struct  lnode
{
  int  data;
  struct  lnode  *next;
  }LNode,*linklist;
 
 
void  creatlink1(linklist head) 
{
 /*线性链表顺序的创建*/
  cout<<"线性链表的顺序输入:"<<endl;
 linklist  p,q;
  char  c;/////当输入#号表链表输入结点结束
  q=head;
  cin>>c;
  while(c!='#')
   {
     p=(linklist)malloc(sizeof(LNode));
     cin>>p->data;
     q->next=p;
     q=p;
     cin>>c;
   }
  p->next=NULL;
}////////creatlink1

 

  void creatlink2(linklist head)
  { /*线性链表逆序的创建*/
     cout<<"线性链表的逆序输入:"<<endl;
    linklist  p;
    char c;////当输入字符为#时,表示链表结点结束
    head->next=NULL;
     cin>>c;
     while(c!='#')
      {
        p=(linklist)malloc(sizeof(LNode));
          cin>>p->data;
          p->next=head->next;
          head->next=p;  
         cin>>c;
      }
  }//////creatlink2
 
 


 
 
 void  sortlink(linklist  head)
  {/*单链表的选择排序*/
    linklist  p,q,r,s,t,sit;
    s=head;
    p=s->next;
    while(p!=NULL)
     {
       t=p;
       sit=p;
       for(q=p->next;q!=NULL;q=q->next)
         {        
        if(q->data<p->data)   {r=t;sit=q;}
        t=q;  
         }
       if(sit!=p)
       {
       s->next=sit;
       r->next=sit->next;
       sit->next=p;      
       }
 
     s=p;
     p=p->next; 
    }
 
  }////////end of  sortlink
 
 
  void  reverseorderprint(linklist head)
   {
     linklist  p,q,r;
     p=head;
     for(q=p->next;q!=NULL;q=r)
       {
         r=q->next;
        if(p==head)  q->next=NULL;
        else
          q->next=p;
        if(r==NULL)  head->next=q; 
        p=q;
      
       }
  
  }
   
 
void  printlink(linklist head)
 {
  /*线性链表的输出*/
    linklist p=head->next;
    while(p!=NULL)
     {
      cout<<p->data;
      p=p->next;  
    
     }
 }  
  
  

int main(int argc, char *argv[])
{
  linklist  head;
   //linklist p;
   head=(linklist)malloc(sizeof(LNode));

    int  k;/////用于选择创建链表的方式,0表顺序创建,1表逆序创建
  cout<<"请选择你创建链表的方式:"<<endl;
  cin>>k;
 
   if(k==0)
    creatlink1(head);
    else
    creatlink2(head);
  
     cout<<"初始链表的数据为:"<<endl;
     printlink(head); 
  
    sortlink(head);
 
    cout<<"排序后的链表数据为:"<<endl;
   printlink(head); 
  
     reverseorderprint(head);
    cout<<"倒序输出的链表数据为:"<<endl;
     printlink(head);
  system("PAUSE"); 
  return 0;
}

其实重新写下数据结构中的程序的想法早就有,只是最近不知道是不是自己真的太忙了(还是自己

给自己的借口),感觉自己的任务又停了好久,现在开始一点点算一点吧。只是之前想到了些关于

链表的操作,但并没有实践,也许它真的只是很麻烦的,自认为自己是个很怕麻烦的。今天还是写

了下,从中发现了很多问题,特别是做到排序时,不知道自己怎么搞的,当用到插入法排序时就只

能对链表做一次排序,看了好久也没看出哪出问题了,不知道卡在哪了,最后还是改用了选择排

序。其它的排序没想了……

代码如下:void  sortlink(linklist head)
    {
     /*单链表的排序*/
     linklist  p,q,r;
      int flag1=0,flag2;
        p=head->next;
        r=head;
        q=p=head->next;
       while(p!=NULL)
        {
          flag1=1;
          flag2=1;
         q=p->next;
         if(p->data>q->data)
           {
             if(q->next==NULL)
            {
             r->next=q;
             q->next=p;
             p->next=NULL; 
             flag2=0;    
            }
            else
            {
            p->next=q->next;
            q->next=p;
            r->next=q; 
            }
          flag1=0;  
          }
           if(flag2==0) break;
           if(flag1==1) {r=p;p=p->next; }
           else r=q;
          
          // p=p->next;  
       }////while   
   }///////sortlink
 

望高手指点。。没想明白。。

做这些小小程序只是为了让自己更了解一些结构,同时也可以提高自己的一点自信嘛,慢慢

来,这是对自己常说的一句了。

抱歉!评论已关闭.