#include"stdio.h"
struct link{
int data;
struct link *next;
};
//創建鏈表
struct link *createLink(int *p,int num)
{
struct link *head;
struct link *newNode;
struct link *pre;
int i;
head=(struct link *)malloc(sizeof(struct link));
head->next =NULL;
pre=head;
for(i=0;i<num;i++)
{
newNode=(struct link *)malloc(sizeof(struct link));
newNode->data =p[i];
newNode->next =NULL;
pre->next =newNode;
pre=newNode;
}
return head;
}
//輸出鏈表
void printLink(struct link *head)
{
struct link *p;
if(head->next ==NULL)
return ;
p=head->next ;
while(p)
{
printf("%d\n",p->data );
p=p->next ;
}
}
//鏈表的排序
struct link *sortLink(struct link *p)
{
struct link *startNode,*endNode,*pra,*temp1,*temp2;
int temp;
startNode=p->next ;
endNode=pra=startNode;
if(startNode->next ==NULL)
return p;
//找到鏈表的表尾
while(endNode->next )
{
pra=endNode;
endNode=endNode->next ;
}
while(pra!=startNode)
{
temp1=startNode;
temp2=startNode->next ;
while(1)
{
if(temp1->data>temp2->data )
{
temp=temp1->data ;
temp1->data =temp2->data ;
temp2->data =temp;
}
if(temp2==endNode)
break;
temp1=temp2;
temp2=temp2->next ;
}
endNode=startNode;
while(endNode->next!=pra )
endNode=endNode->next ;
pra=endNode;
endNode=endNode->next ;
}
return p;
}
//合併兩個鏈表
struct link *conLink(struct link *a,struct link *b)
{
struct link *link1,*link2,*temp1,*temp2;
link1=a->next ;
link2=b->next ;
temp2=link2->next ;
while(link1->next !=NULL&&link2!=NULL)
{
temp1=link1->next ;
if(temp1->data>link2->data )
{
link2->next=link1->next ;
link1->next =link2;
link2=temp2;
temp2=temp2->next ;
link1=link1->next ;
}else
{
link1=temp1;
}
}
if(link2!=NULL)
{
while(link2)
{
link1->next =link2;
link1=link2;
link2=link2->next ;
}
}
return a;
}
struct link *comLink(struct link *a,struct link *b)
{
struct link *link1,*link2;
link1=a->next ;
link2=b->next ;
if(link1->data <link2->data )
return conLink(a,b);
else
return conLink(b,a);
}
//鏈表反轉
struct link *revLink(struct link *p)
{
struct link *temp1,*temp2,*temp3;
temp1=p->next ;
if(temp1->next ==NULL)
return p;
temp2=temp1->next ;
temp1->next =NULL;
while(temp2->next !=NULL)
{
temp3=temp2->next ;
temp2->next =temp1;
temp1=temp2;
temp2=temp3 ;
}
temp3->next=temp1;
p->next =temp3;
return p;
}
void main()
{
struct link *head;
struct link *sortlink;
struct link *A,*B;
struct link *comlink;
struct link *sortA,*sortB;
struct link *revlink;
int a[5]={2,55,4,66,7};
int b[6]={3,44,55,6,7,77};
printf("鏈表操作\n");
//創建一個鏈表
head=createLink(a,5);
printLink(head);
//排序鏈表
printf("鏈表排序\n");
sortlink=sortLink(head);
printLink(sortlink);
//合併兩個鏈表
A=createLink(a,5);
B=createLink(b,6);
sortA=sortLink(A);
sortB=sortLink(B);
printf("打印鏈表A\n");
printLink(sortA);
printf("打印鏈表B\n");
printLink(sortB);
comlink=comLink(sortA,sortB);
printf("合併後的鏈表\n");
printLink(comlink);
A=createLink(a,5);
printf("鏈表反轉前:\n");
printLink(A);
revlink=revLink(A);
printf("鏈表反轉後:\n");
printLink(revlink);
getchar();
}
鏈表操作總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.