纯代码,给学弟解决的一道问题

#include <stdio.h>
#include <stdlib.h>

struct llist
{
    int num;
    struct llist *next;
};
typedef struct llist node;
typedef node *llink;

//链表的输出 这道题目是用来abcde,你输入e,输出eabcd;你输入d,输出deabc
void printllist(llink ptr)
{
   while ( ptr != NULL )         
   {
      printf("[%d]",ptr->num);   
      ptr = ptr->next;            
   }
   printf("\n");                  
}

//链表的建立
llink createllist(int *array,int len)
{
   llink head;                     /* 链表的开始指针    */
   llink ptr,ptr1;
   int i;

   /* 建立第一个节点 */
   head = ( llink ) malloc(sizeof(node)); /* 分配内存*/
   if ( !head )                  
      return NULL;
   head->num = array[0];         
   head->next = NULL;             
   ptr = head;                    
   for ( i = 1; i < len; i++ )    
   {
       ptr1 = ( llink ) malloc(sizeof(node));
       if ( !ptr1 )
          return NULL;
       ptr1->num = array[i];      /* 建立节点内容      */
       ptr1->next = NULL;         /* 设定指针初值      */
       ptr->next = ptr1;          /* 连结节点          */
       ptr = ptr->next;           /* 指向下一节点      */
   }
   return head;
}


//链表的结点遍历
llink findnode(llink head,int num)
{
   llink ptr=NULL;
   

     ptr = head;                 
   while ( ptr != NULL )          
   {
      if ( ptr->num == num )      
         return ptr;
      ptr = ptr->next;            
   }
   return ptr;
}

//链表的前一个结点寻找
llink findPreNode(llink head,llink ptr)
{
    
    llink pre;//前结点
    pre=head;
    if(ptr==head)//第一结点
    {
        return ptr;
    }
    while(pre->next !=ptr)
    {
        pre=pre->next;
    }
    return pre;

}





//链表的内存释放
void freellist(llink head)
{
   llink ptr;

   while ( head != NULL )         
   {
      ptr = head;
      head = head->next;          /* 指向下一节点      */
      free(ptr);                 
   }
}

//改变链表指向
llink changenode(llink head,llink ptr,llink pre)
{
    if(ptr==head)//第一结点
    {
        return head;
    }
    pre->next=ptr->next;
    ptr->next=head;
    //head->next=ptr;
    head=ptr;
    return head;
}


int main(int argc, char *argv[])
{
  int llist1[6] = { 123456 };  
   llink head;                    
   llink ptr;
   int num;                      
   int value;                   

   head = createllist(llist1,6);  
   if ( !head )
   {
      printf("内存分配失败! \n");
      exit(1);
   }
   printf("原来的链表: ");
   printllist(head);             
   while ( 1 )
   {
      printf("输入你要排在前面的字符==> ");
       scanf("%d",&num);     
       ptr=findnode(head,num);
       if(ptr==NULL)
       {
            printf("不存在你输入的字符\n");
       }
        else
        {
            llink pre=findPreNode(head,ptr);
            //printf("%d",pre->num);
            head=changenode(head,ptr,pre);
            printllist(head);

        }

   }
  freellist(head);               
  system("PAUSE");
  return 0;
}
posted @ 2011-10-06 22:56  草珊瑚  阅读(267)  评论(0编辑  收藏  举报