链表所用的数据结构为:
typedef struct Node
{
int data;
struct Node* next;
}Node;
typedef Node* LinkList;
返回链表的长度:
int LinkLength(LinkList L)
{
int length = 0;;
while(L->next != NULL)
{
length++;
L = L->next;
}
return length;
}
在链表的尾部插入数据:
void InsertList(LinkList* L,int e)
{
LinkList p = *L;
while(p->next != NULL)
p = p->next;
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = NULL;
p->next = s;
}
链表的排序代码如下:
LinkList Sort(LinkList *L)
{
LinkList p = *L;
int n = LinkLength(p);
if(p == NULL || p->next == NULL)
return p;
for(int i = 1;i <= n;i++)
{
p = (*L)->next; //让p始终指向第一个元素
for(int j = 1;j <= n - i;j++)
{
if(p->data > p->next->data) //和相邻的元素比较
{
int temp = p->data;
p->data = p->next->data;
p->next->data = temp;
}
p = p->next; //让p指向下一个结点
}
}
}
链表逆置逆置的代码如下:
void ReverseLink(LinkList L)
{
LinkList p1,p2,p3;
if(L->next == NULL || L->next->next == NULL)
return ;
p1 = L; //p1指向头结点
p2 = L->next; //p2指向第一个元素
while(p2) //如果p2不为空的话,即p1不是最后一个结点
{
p3 = p2->next; //先将p2指向的下一个结点保存起来
p2->next = p1; //将链表逆置,即让下一个结点的next指向他前面的那个结点
p1 = p2; //将结点前移
p2 = p3;
}
L->next->next = NULL; //L是逆置之前的头结点,
//L->next指向的是逆置之前的
//第一个结点逆置之后就变成了最后一个结点,
//所以让最后一个结点的next指向NULL
L->next = p1; //循环结束后,p1变成了逆置前的最后一个结点,
//也就是逆置后的第一个结点,L始终是头结点,
//所以让头结点指向第一个结点
}