单链表的逆置
思路:现将头表置空,随后使用头插法进行操作。
具体单链表操作见文章:链表的基本操作
分别定义两个指针一个指向移动的数据,另一个指向下一个数据进行移动。
void Reverse_linklist(Linklist H)
{
Linklist p, q;
p = H->next;
H->next = NULL;//置空表
while(p)
{
q = p;
p = p->next;
q->next = H->next;
H->next = q; //头插法进行
}
}
循环链表
循环链表的基本操作与单链表基本一致,主要是链表的最后一个指向头结点仅此而已。
定义循环链表结点与单链表一致。
//头插法建立
//头插法建立链表
Linklist Creat_Hlinklist()
{
Linklist H = (Linklist)malloc(sizeof(Linklist));
H->next = H;//与单链表不同之处
Linklist p;
int x = 0;
scanf("%d", &x);
while(x!=-1)
{
p = (Linklist)malloc(sizeof(Linklist));
p->data = x;
p->next = H->next;
H->next = p;
scanf("%d", &x);
}
return H;
}
其他操作只需要将判断条件更改为尾结点是否指向头结点即可。
比如举一个简单的例子:
求链表的表长:
int linklist_length(Linklist L)
{
Linklist p = L;
int j = 0;
while(p->next!=H)//判断条件不同
{
j++;
p = p->next;
}
return j;
}