您的位置:首页 > 其它

关于单链表的基本操作

2007-09-08 21:40 260 查看
#include <malloc.h>
#include <stdio.h>
//以下链表均带有头节点;头节点不存放数据,只起到带头作用。
typedef struct LNode{
 int data;
 struct LNode *next;
}LinkNode;

//单链表的建立(倒插入法)
LinkNode * CreatList(LinkNode *L,int n){
 L=(LinkNode*)malloc(sizeof(LinkNode));
 L->next=NULL;
 struct LNode * p;
 int i;
 for(i=n;i>0;--i){
  p=(LinkNode*)malloc(sizeof(LinkNode));
     printf("input the data:/n");
  scanf("%d",&p->data);
  p->next =L->next ;
  L->next =p;
 }
 return L;
}
//单链表的测长
int GetLength(LinkNode *L){
 LinkNode * p=L->next;
 int len=0;
 while(p!=NULL ){
     len++;
  p=p->next ;
 }
 return len;
}
//单链表的打印
void DisplayList(LinkNode *L){
 struct LNode *p=L->next ;
 while(p!=NULL ){
  printf("%d/n",p->data);
  p=p->next ;
 }
}
//单链表(不包含头节点)的打印
void DisplayList1(LinkNode *L){
 struct LNode *p=L;
 while(p!=NULL ){
  printf("%d/n",p->data);
  p=p->next ;
 }
}
//删除链表的头节点。
LinkNode * RemoveHead(LinkNode *L){
 LinkNode *p =L;
 p=p->next;
 free(L);
 return p;
}
//单链表改进冒泡排序
void BubbleSort(LinkNode *L){
 LinkNode *p1;
 if(L->next==NULL || L->next->next==NULL)
  return ;
 int length= GetLength(L);
 int i,j,temp;
 bool exchange;
 for(j=1;j<length;j++)
 {
  exchange = false;
  for(p1=L->next,i=0;i<length-j ;i++,p1=p1->next)
  {
   if(p1->data>p1->next->data)
   {
    temp=p1->data;
    p1->data=p1->next->data;
    p1->next->data=temp;
    exchange=true;
   }
   if(!exchange)
    return;
  }
 }
}
//有序单链表插入一个节点
LinkNode* LinkInsert(LinkNode *L,int element){
 LinkNode *p0,*p1=L->next,*p2=L;
 p0=(LinkNode*)malloc(sizeof(LinkNode));
 p0->data=element;
 if(p1==NULL){//L仅包含头节点,直接插入头节点后。
  L->next= p0;
  p0->next=NULL;
  return L;
 }
 while(p1->next !=NULL && element>p1->data){
  p2=p1;
  p1=p1->next;
 }
 if(element<p1->data){
  p2->next=p0;//插入到P2节点之后。
  p0->next=p1;
 }
 else{//插入到最后一个节点的后面。
  p1->next=p0;
  p0->next=NULL;
 }
 return L;
}
//单链表删除指定节点
LinkNode *LinkDelete(LinkNode *L,int element){
 LinkNode *p1=L->next,*p2=L;
 if(p1==NULL){//L只包含头节点。
  printf("list have not element!/n");
  return L;
 }
 while(p1->next !=NULL && element !=p1->data){
  p2=p1;
  p1=p1->next;
 }
 if(element==p1->data)
  p2->next=p1->next;
 else{//搜索到最后没找到。
  printf("%d not been found!/n",element);
  return L;
 }
 free(p1);
 return L;
}
//单链表逆置(包含头节点)
LinkNode * ReverseList(LinkNode *head){
 LinkNode *p1,*p2,*p3;
 if(head->next==NULL || head->next->next==NULL)
  return head;
 p1=head->next;
 p2=p1->next;
 while(p2)
 {
  p3=p2->next;
  p2->next=p1;
  p1=p2;
  p2=p3;
 }
 head->next->next=NULL;
 head->next= p1;
 return head;
}
//单链表逆置(不包含头节点)
LinkNode * ReverseList1(LinkNode *head){
 LinkNode *p1,*p2,*p3;
 if(head==NULL || head->next==NULL)
  return head;
 p1=head;
 p2=p1->next;
 while(p2)
 {
  p3=p2->next;
  p2->next=p1;
  p1=p2;
  p2=p3;
 }
 head->next=NULL;
 head= p1;
 return head;
}
//将两个非递减链表合并为一个非递减序链表
LinkNode* MergeList(LinkNode *La,LinkNode *Lb){
 LinkNode *pa=La->next,*pb=Lb->next,*Lc,*pc;
 Lc=pc=La;
 while(pa!=NULL && pb!=NULL){
  if(pa->data <= pb->data){
   pc->next=pa;
   pc=pa;
   pa=pa->next;
  }
  else{
   pc->next=pb;
   pc=pb;
   pb=pb->next;
  }
 }
 if(pa==NULL)
  pc->next=pb;
 else
  pc->next=pa;
 free(Lb);
 return Lc;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息