鏈表所用的數據結構爲:
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始終是頭結點,
//所以讓頭結點指向第一個結點
}