#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;
}
關於單鏈表的基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.