相关链表操作--简立,逆转,排序,输出

有关链表的建立和逆转在这里就不在多说了,主要是强调一下链表的排序,链表的排序实现几乎和数组的排序几乎一致,仅仅比较和交换链表的关键值比较简单。下面是我实现的几个小程序:
  • #include <stdio.h>
    #include <stdlib.h>
    typedef struct listNode
    {
        struct listNode *link;
        int data;
     }*node;

    //creat a new node
    node getNode(node newNode,int val )
    {
         if(!newNode)
             exit(0);
         newNode->link=NULL;
         newNode->data=val;
         
         return newNode;
     }

    // insert a new node into the linklist

    int insertNode(node prev,node newNode)
    {
        if(!newNode) return 0;
        newNode->link=prev->link;
        prev->link=newNode;
        return 1;
    }

    void buildList(node head)
    {
         int value;
         node newNode=(node)malloc(sizeof(node));
         node p=head;
         scanf("%d",&value);
         // input the value of node in the new linklist
         while(value!=-1)
         {
            newNode=getNode(newNode,value);
            insertNode(p,newNode);
            p=p->link;//p link to the last node
            scanf("%d",&value);
            newNode=(node)malloc(sizeof(node));
         }
     }
     //reverse the linkList
     void reverseList(node head)
     {
         node p=head->link;
         node q=p->link;
         node temp;
         
         // check the linkList is empty
         if(p==NULL)
         {
              printf("The list is empty!\n");
         }
         p->link=NULL;
          while(q!=NULL)
          {
            temp=q->link;
            q->link=p;
            p=q;
            q=temp;                            
          }
          head->link=p;                
     }
     //选择排序
     void sortList(node head)
     {
          node p=head->link;
          node q=p->link;
          node r;
          int temp=0;
          bool flag;
          while(p->link!=NULL)
          {
              r=p;
              flag=false;
               while(q!=NULL)
               {
                   if(r->data>q->data)
                   {
                        r=q;
                        flag=true;
                   }
                   q=q->link;                        
               }
               if(flag)
               {
               temp=p->data;
               p->data=r->data;
               r->data=temp;   
               }
               
               p=p->link;
               q=p->link;                  
          }
          
      }
    void swap(node p,node q)
     {
          int temp;
          temp=p->data;
          p->data=q->data;
          q->data=temp;
      }
    //冒泡排序
    void pupleSortLink(node head)
    {
         node p=head->link;//列表的第一个节点
         node q=p;  //q滑动比较各个节点和其相邻节点
         node r=NULL;//记录有序序列的首个节点
         bool flag;
         while(p->link!=r)
         {
             while(q->link!=r)
             {
                 if(q->data>(q->link)->data)
                   {
                        swap(q,q->link);
                        flag=true;                       
                   }
                   q=q->link;
             }
             if(flag)
             {
                 r=q;
             }
             else
               break;
             q=p;
         }
     }
    // print the value of node in the reversed linkList
    void print(node head)
    {
         node p=head->link;
         while(p!=NULL)
         {
           printf("%d\n",p->data);
           p=p->link;            
         }
         system("pause");
     }
    int main(void)
    {
        node head=(node)malloc(sizeof(node));
        head=getNode(head,0);
        buildList(head);
       // print(head);
      // sortList(head);
        pupleSortLink(head);
        print(head);
        
    }

posted on 2009-10-16 10:36  Creative Common  阅读(281)  评论(0编辑  收藏  举报

导航