關於單鏈表的基本操作

#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;
}

發佈了30 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章