链表基本操作的程序实现(转)

#include<stdio.h>
#include<stdlib.h>
typedefstruct List_Node{
  int info;
  struct List_Node *next;
 }node;//结点结构体
//尾插法建立带头结点的单链表 
node* Creat_Node()
{
  node *head,*pre,*p;
  int x;
  head=(node*)malloc(sizeof(node));;
  head->next=NULL;
  pre=head;
  printf("输入各结点的值,以0结束:");
  while(EOF!=(scanf("%d",&x))&&x!=0)
  {
      p=(node*)malloc(sizeof(node));
      p->info=x;
      p->next=pre->next;
      pre->next=p;
      pre=pre->next;
  }
  return head;
}
//头插法建立带头结点的单链表 
node* Build_Node()
{
  node *head,*p;
  int x;
  head=(node*)malloc(sizeof(node));;
  head->next=NULL;
  printf("输入各结点的值,以0结束:");
  while(EOF!=(scanf("%d",&x))&&x!=0)
  {
      p=(node*)malloc(sizeof(node));
      p->info=x;
      p->next=head->next;
      head->next=p;
  }
  return head;
}

//       打印单链表       

void Print_Node(node *head)
{
  node *p=head->next;
  printf("输出该链表:");
  while(p)
  {
      printf("%-5d--->",p->info);
      p=p->next;
  }
  if(p==NULL)
  {
      printf("^\n\n\n");
  }
}

#include"Head_Node.h"
int Count_Node(node *head)
{
  node *p=head->next;
  int num=0;
  while(p!=NULL)
  {
      num++;
      p=p->next;
  }
  return num;
}
int main()
{
  node *head;
  head=Creat_Node();
  Print_Node(head);
  printf("结点个数为:%d\n",Count_Node(head));
  return 0;
}

#include"head_node.h"

//       删除重复         

void Delete_Repeat_Node(node *head)
{
  node *p,*pre,*s;
  pre=head->next;
  p=pre->next;
  while(p)
  {
      s=p->next;
      while(s&&s->info!=p->info)
      {
         s=s->next;
      }
      if(s)
      {
         pre->next=p->next;
         free(p);
         p=pre->next;
      }
      else
      {
         pre=p;
         p=p->next;
      }
  }
}
int main()
{
  node *head;
  head=Creat_Node();
  Print_Node(head);
  Delete_Repeat_Node(head);
  Print_Node(head);
  return 0;
}

#include"Head_Node.h"

//          在Y前插入X          

void Before_y_Insert_x(node* head,int y,int x)
{
  node *pre,*p,*s;
  pre=head;
  p=pre->next;
  while(p&&p->info!=y)
  {
      pre=p;
      p=p->next;
  }
  if(p==NULL)
  {
      printf("error!%d不在该链表中\n",y);
  }
  else
  {
      s=(node*)malloc(sizeof(node));
      s->info=x;
      s->next=p;
      pre->next=s;
  }
}
int main()
{
  node *head;
  int x,y;
  head=Creat_Node();
  printf("在y前插入x,输入y,x:");
  scanf("%d%d",&y,&x);
  Print_Node(head);
  Before_y_Insert_x(head,y,x);
  Print_Node(head);
  return 0;
}

#include"Head_Node.h"

//        判断链表是否有序       

int Is_Sort(node *head)
{
  node *p,*pre;
  int flag;
  pre=head->next;
  p=pre->next;
  flag=pre->info>p->info?1:0;
  while(p)
  {
      pre=p;
      p=p->next;
      if(p)
      {
         if(flag!=pre->info>p->info?1:0)
         {
            return 0;
         }
      }
  }
  return 1;
}
int main()
{
  node *head;
  int flag;
  head=Creat_Node();
  Print_Node(head);
  flag=Is_Sort(head);
  if(flag==1)
  {
      printf("该链表有序!\n");
  }
  else
  {
      printf("该链表无序!\n");
  }
  return 0;
}

#include"Head_Node.h"

//        链表反序             

void convert_Node(node *head)
{
  node *pre,*p=head->next;
  head->next=NULL;
  while(p)
  {
      pre=p;
      p=p->next;
      pre->next=NULL;
      pre->next=head->next;
      head->next=pre;
  }
}
      
      
  
int main()
{
  node *head;
  head=Creat_Node();
  Print_Node(head);
  convert_Node(head);
  Print_Node(head);
  return 0;
}

#include"Head_Node.h"

//   将奇偶数按原相对顺序分开   

node *Divide_Node(node *head1)
{
  node *head2,*pre,*p,*s;
  p=head1->next;
  pre=head1;
  head2=(node*)malloc(sizeof(node));
  head2->next=NULL;
  s=head2;
  while(p)
  {
      if(p->info%2)
      {
         pre->next=p->next;
         p->next=s->next;
         s->next=p;
         s=p;
         p=pre->next;
      }
      else
      {
         pre=p;
         p=p->next;
      }
  }
  return head2;
}
int main()
{
  node *head,*head2;
  head=Creat_Node();
  Print_Node(head);
  head2=Divide_Node(head);
  printf("打印偶数链表\n");
  Print_Node(head);
  printf("打印奇数链表\n");
  Print_Node(head2);
  return 0;
}

#include"Head_Node.h"

//删除所有大于x而不大于Y的结点 

void Delete_X_y(node *head,int x,int y)
{
  node *pre=head,*p=head->next;
  if(x>=y)
  {
      printf("不符合条件!\n");
      return ;
  }
  while(p)
  {
      if(p->info>x&&p->infonext=p->next;
         free(p);
         p=pre->next;
      }
      else
      {
         pre=p;
         p=p->next;
      }
  }
}
int main()
{
  node *head;
  int x,y;
  head=Creat_Node();
  printf("输出x,y的值:");
  scanf("%d%d",&x,&y);
  Print_Node(head);
  Delete_X_y(head,x,y);
  Print_Node(head);
  return 0;
}

#include"Head_Node.h"

//            直接插入排序                 

void Insert_Sort(node *head)
{
  node *p,*pre,*s,*r;
  p=head->next;
  head->next=NULL;
  while(p)
  {
      pre=p->next;
      r=head;
      s=head->next;
      while(s&&s->infoinfo)
      {
         r=s;
         s=s->next;
      }
      p->next=r->next;
      r->next=p;
      p=pre;
  }
}
      
      
int main()
{
  node *head;
  head=Creat_Node();
  Print_Node(head);
  Insert_Sort(head);
  Print_Node(head);
  return 0;
}

#include"head_node.h"
node* merge_two_List(node *head1,node *head2)
{
  node *head,*s,*p,*r;
  p=head1->next;
  s=head2->next;
  head=(node*)malloc(sizeof(node));
  head->next=NULL;
  r=head->next;
  while(s&&p)
  {
      if(p->infoinfo)
      {
         head1->next=p->next;
         p->next=NULL;
         r->next=p;
         r=r->next;
         p=head1->next;
      }
      else
      {
         head2->next=s->next;
         s->next=NULL;
         r->next=s;
         r=r->next;
         s=head2->next;
      }
  }
  while(s)
  {
      head2->next=s->next;
      s->next=NULL;
      r->next=s;
      r=r->next;
      s=head2->next;
  }
  while(p)
  {
      head1->next=p->next;
      p->next=NULL;
      r->next=p;
      r=r->next;
      p=head1->next;
  }
  //free(head1);
  //free(head2);
  return head;
}
int main()
{
  node *head,*head1,*head2;
  head1=Creat_Node();
  head2=Creat_Node();
  head=merge_two_List(head1,head2);
  Print_Node(head);
  return 0;
}
//转自http://linux.chinaunix.net/techdoc/beginner/2007/11/12/972070.shtml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值