c语言 链表

来源:互联网 发布:js 二进制 编辑:程序博客网 时间:2024/05/22 00:33
 
/***********************************************/
/*链表的删除:三种情况,头节点,中节点,尾节点
/*
/*selection_sort()遍历整个连表,并找出最大值
/* 9-5-2007
/***********************************************/

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

struct list
{
 int data;
 struct list *next;
};
typedef struct list node;
typedef node *link;

link delete_node(link pointer,link tmp)
{
 link deletenode;
 if(tmp==NULL)          //delete the first node
 {
        tmp=pointer->next;
  free(pointer);
  return tmp;        //always renturn the first node's pointer
 }
 else                   //not the first node then ..
 {
  if(tmp->next->next==NULL)  //delete the last node
  {
            deletenode=tmp->next;
   tmp->next=NULL;
   free(deletenode);
  }
  else
  {
   deletenode=tmp->next;    //delete the middle node
   tmp->next=tmp->next->next;
   free(deletenode);
  }
  return pointer;
 }
}

void selection_sort(link pointer,int num)
{
     link tmp,btmp;
  int i, min;
  for(i=0;i<num;i++)
  {
   tmp=pointer;
   min=tmp->data;
         btmp=NULL;
   while(tmp->next)          //遍历整个链表
   {
    if(min>tmp->next->data)
    {
     min=tmp->next->data;
     btmp=tmp;          //find the delete node
    }
    tmp=tmp->next;
   }
   printf("%d/n",min);
   pointer=delete_node(pointer,btmp);
  }
}

link create_list(int array[],int num)
{
 link tmp1,tmp2,pointer;
 int i;
 pointer = (link)malloc(sizeof(node));   
 pointer->data=array[0];

 tmp1=pointer;
 for(i=0;i<num;i++)
 {
  tmp2=(link)malloc(sizeof(node));
  tmp2->next=NULL;
  tmp2->data=array[i];
  tmp1->next=tmp2;
  tmp1=tmp2;    
 }
 return pointer;
}

void main()
{
 int arr[]={3,12,8,9,11};
 link ptr;
 ptr=create_list(arr,5);
 selection_sort(ptr,5);
 system("pause");
}
==================================================================
==================================================================
 

/*****************************************/
/*
/*冒泡算法
/*注意头节电,中间节点,尾节点的处理
/*****************************************/

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

struct list
{
 int data;
 struct list *next;
};
typedef struct list node;
typedef node *link;

link create_list(int array[],int num)  // {
    link tmp1,tmp2,pointer;
 int i;

 pointer=(link)malloc(sizeof(node)); //¶¯Ì¬µÄ·ÖÅäÄÚ´æ¿Õ¼ä
 pointer->data=array[0];             //ÊäÈëµÚÒ»¸öÔªËØ
 tmp1=pointer;
 for(i=0;i<num;i++)
 {
  tmp2=(link)malloc(sizeof(node));
  tmp2->data=array[i];
  tmp2->next=NULL;
  tmp1->next=tmp2;
  tmp1=tmp2;
 }
 return pointer;
}


void bubble_sort(link pointer,int num)
{
     link tmp;
  int i,j,k;

  for(i=1;i<num;i++)
  {
   tmp=pointer;
   for(j=1;j<num;j++)
   {
    if(tmp->data>tmp->next->data)
    {
     k=tmp->data;
     tmp->data=tmp->next->data;
     tmp->next->data=k;
    }
    tmp=tmp->next;
   }
  }
}

//´òÓ¡

void print_list(link pointer)
{
 while(pointer)
 {
  printf("%d/n",pointer->data);
  pointer=pointer->next;
 }
}


//²åÈëÔªËØ

link insert_node(link pointer,link btmp,int value)
{
 link newnode;
 if(btmp==NULL)     //头节点
 {
        newnode=(link)malloc(sizeof(node));
  newnode->data=value;
  newnode->next=pointer;
  return pointer;
 }
 else
 {
  if(btmp->next==NULL) //尾 
  {
   newnode=(link)malloc(sizeof(node));
   newnode->data=value;
   btmp->next=newnode;
   newnode->next=NULL;
  }
  else              //中间节点
  {
            newnode=(link)malloc(sizeof(node));
   newnode->data=value;
   newnode->next=btmp->next;  //应先指明新节点的指向
   btmp->next=newnode;
  }
  return pointer;
 }
}


link search_insert_location(link pointer,int value)
{
 link tmp,btmp;
 int OTRUE=1;

 tmp=pointer;
 btmp=NULL;
 while(tmp&&OTRUE)
 {
  if(value<tmp->data)    //对新节点插入已排序的链表进行再排序
  {
   OTRUE=0;
  }
  else
  {
   btmp=tmp;
   tmp=tmp->next;
  }
 }

 pointer=insert_node(pointer,btmp,value);
 return pointer;
}

void main()
{
 int arr[]={3,12,8,9,11};
 link ptr;
 ptr=create_list(arr,5);
 bubble_sort(ptr,5);
 printf("print before insert node../n");
    print_list(ptr);
 ptr=search_insert_location(ptr,15);
 printf("print after insert node 15../n");
 print_list(ptr);
 ptr=search_insert_location(ptr,7);
 printf("print after insert node 7../n");
 print_list(ptr);

 system("pause");
}