5.反转链表6.链接两个链表
5.反转链表解:
1) 从首节点开始为节点、下一个节点的下一个节点为Pointer节点,若Back节点是首节点,则将节点的指针设为NULL。下一个节点设为Pointer节点的指针,将Pointer节点的指针指向上一个节点,Back节点设为Pointer节点,Pointer 节点设为下一个节点。
Back=Head
Pointer=Back->Next
Pointer->Next=Back
Back=Pointer
Pointer=Next
2) 下一个节点设为Pointer节点指针,将Pointer节点的指针向上一个节点,下一个节点设为Pointer节点,Pointer节点设为下一个节点。
Next=Pointer->Next
Pointer->Next=Back
Back=Pointer
Pointer=Next
重复步聚2),直到Pointer节点的指针为NULL为止。
3)将Pointer节点的指针指向上一个节点,首节点Head节点设为Pointer节点。
Pointer->Next=Back
Head=Pointer
*程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#define Max 10
struct List /*节点结构声明*/
{
int Number;
int Total;
struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int Data[2][Max]={1,3,5,7,2,4,6,8,9,10,15,35,10,67,25,65,38,70,30,20};
/*反转链表*/
Link Invert_List(Link Head)
{
Link Pointer; /*节点声明*/
Link Back; /*上一个节点*/
Link Next; /*下一个节点*/
Back=Head; /*Back指针设为首节点*/
Pointer=Back->Next;
Back->Next=NULL;
Next=Pointer->Next;
Pointer->Next=Back;
Back=Pointer;
Pointer=Next;
while(Pointer->Next!=NULL) /*当到达链表尾端时结束循环*/
{
Next=Pointer->Next;
Pointer->Next=Back;
Back=Pointer;
Pointer=Next;
}
Pointer->Next=Back;
Head=Pointer;
return Head;
}
/*输出链表*/
void Print_List(Link Head)
{
Link Pointer; /*节点声明*/
Pointer=Head; /*Pointer指针设为首节点*/
while(Pointer!=NULL) /*当节点为NULL结束循环*/
{
printf("[%d,%d]",Pointer->Number,Pointer->Total);
Pointer=Pointer->Next; /*往下一个节点*/
}
printf("\n");
}
/*释放链表*/
void Free_List(Link Head)
{
Link Pointer; /*节点声明*/
while(Head!=NULL) /*当节点为NULL结束循环*/
{
Pointer=Head;
Head=Head->Next; /*往下一个节点*/
free(Pointer);
}
}
/*建立链表*/
Link Create_List(Link Head)
{
Link New; /*节点声明*/
Link Pointer;
int i;
Head=(Link)malloc(sizeof(Node)); /*分配内存*/
if(Head==NULL)
printf("Memory allocate Failure!\n"); /*内存分配失败*/
else
{
Head->Number=Data[0][0]; /*定义首节点数据编号*/
Head->Total=Data[1][0];
Head->Next=NULL;
Pointer=Head; /*Pointer指针设为首节点*/
for(i=1;i<Max;i++)
{
New=(Link)malloc(sizeof(Node)); /*分配内存*/
New->Number=Data[0][i];
New->Total=Data[1][i];
New->Next=NULL;
Pointer->Next=New; /*将新节点串连在原列表尾端*/
Pointer=New; /*列表尾端节点为新节点*/
}
}
return Head;
}
/*主程序*/
void main()
{
Link Head; /*节点声明*/
Head=Create_List(Head); /*建立链表*/
if(Head!=NULL)
{
printf("Input Data:\n");
Print_List(Head); /*输出链表*/
Head=Invert_List(Head); /*反转链表*/
printf("After Invert:\n");
Print_List(Head); /*输出链表*/
Free_List(Head); /*释放链表*/
}
}
*运行结果
------------------------------------------------------
6.链接两个链表
解:
两个链表的链接是将第2个链表的首节点串接在第1个链表的尾端。找到第1个链表的尾端,将该节点指针指向第2个节点的首节点。
*程序代码如下:
#include<stdlib.h>
#include<stdio.h>
#define Max1 10
#define Max2 6
struct List /*节点结构声明*/
{
int Number;
struct List *Next;
};
typedef struct List Node;
typedef Node *Link;
int Data1[Max1]={1,2,3,4,5,6,7,8,9,10};
int Data2[Max2]={11,12,13,14,15,16};
/*链接链表*/
Link Concatenate_List(Link Head1,Link Head2)
{
Link Pointer; /*节点声明*/
Link Next=NULL; /*下一个节点*/
Pointer=Head1; /*Pointer指针设为首节点*/
while(Pointer->Next!=NULL) /*当达链表尾端时结束循环*/
Pointer=Pointer->Next;
Pointer->Next=Head2;
return Head1;
}
/*输出链表数据*/
void Print_List(Link Head)
{
Link Pointer; /*节点声明*/
Pointer=Head; /*Pointer指针设为首节点*/
while(Pointer!=NULL) /*当节点为NULL结束循环*/
{
printf("[%d]",Pointer->Number);
Pointer=Pointer->Next; /*指向下一个节点*/
}
printf("\n");
}
/*释放链表*/
void Free_List(Link Head)
{
Link Pointer; /*节点声明*/
while(Head!=NULL) /*当节点为NULL结束循环*/
{
Pointer=Head;
Head=Head->Next; /*往下一个节点*/
free(Pointer);
}
}
/*建立链表*/
Link Create_List(Link Head,int *Data,int Max)
{
Link New; /*节点声明*/
Link Pointer;
int i;
Head=(Link)malloc(sizeof(Node)); /*分配内存*/
if(Head==NULL)
printf("Memory allocate Failure!\n"); /*内存分配失败*/
else
{
Head->Number=Data[0]; /*定义首节点数据编号*/
Head->Next=NULL;
Pointer=Head; /*Pointer指针设为首节点*/
for(i=1;i<Max;i++)
{
New=(Link)malloc(sizeof(Node)); /*分配内存*/
New->Number=Data[i];
New->Next=NULL;
Pointer->Next=New; /*将新节点串连在原列表尾端*/
Pointer=New; /*列表尾端节点为新节点*/
}
}
return Head;
}
/*主程序*/
void main()
{
Link Head=NULL; /*节点声明*/
Link Head1=NULL;
Link Head2=NULL;
Head1=Create_List(Head1,Data1,Max1); /*建立链表1*/
Head2=Create_List(Head2,Data2,Max2); /*建立链表2*/
if(Head1!=NULL&&Head2!=NULL)
{
printf("Input Data:\n");
Print_List(Head1); /*输出链表1*/
Print_List(Head2); /*输出链表2*/
Head=Concatenate_List(Head1,Head2); /*链接链表*/
printf("After Concatenate:\n");
Print_List(Head); /*输出链接后的链表*/
Free_List(Head); /*释放链表*/
}
}
*运行结果如下: