// 2014年4月15日
// 循环链表
// 和单链表唯一的不同就是判断尾指针的依据,是判断当前指针和头结点的地址是否相等。
// 存储结构
// 用头结点记录链表长度
// head node node0 node1 end node
// [data|next] -> [data|next] -> [data|next] ... [data|next]
// ↑ ↓
// -----------------------------------------------------
//
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
typedef int element_t;
typedef struct node_t
{
struct node_t *next;
element_t data;
} *linklist_t, node_t;
void linklist_init(linklist_t& list)
{
list = (linklist_t)malloc(sizeof(node_t));
list->next = list;
list->data = 0;
}
void linklist_clear(linklist_t& list)
{
node_t *p = list->next;
while (p != list)
{
node_t *q = p->next;
free(p);
p = q;
}
}
void linklist_destroy(linklist_t &list)
{
linklist_clear(list);
free(list);
list = 0;
}
int linklist_length(linklist_t& list)
{
return list->data;
}
bool linklist_insert(linklist_t& list, int i, element_t e)
{
if ((i < 1) || (i > linklist_length(list)+1))
{
return false;
}
node_t *p = list; // 从头结点开始找前驱节点
for (int n=0; n < i-1; ++n)
{
p = p->next;
}
node_t *q = (node_t *)malloc(sizeof(node_t));
q->data = e;
q->next = p->next;
p->next = q;
++list->data;
return true;
}
bool linklist_delete(linklist_t& list, int i, element_t *e)
{
if ((i < 1) || (i > linklist_length(list)))
{
return false;
}
node_t *p = list; // 从头结点开始找前驱节点
for (int n=0; n < i-1; ++n)
{
p = p->next;
}
node_t *q = p->next;
p->next = q->next;
if (e != 0)
{
*e = q->data;
}
free(q);
--list->data;
return true;
}
bool linklist_is_empty(linklist_t& list)
{
return list->next == list;
}
void print(linklist_t& list)
{
for (node_t *p = list->next; p != list; p = p->next)
{
printf("%02d ", p->data);
}
printf("\n");
}
int range(int a, int b)
{
return rand()%b + a;
}
int main()
{
int n = 10;
int size = 10;
while (n--)
{
printf("n=%d\n", n);
linklist_t list;
linklist_init(list);
// 随机插入
int a = range(1, size);
while (a--)
{
int i = range(1, 10);
int j = range(1, 10);
if (!linklist_insert(list, i, j))
{
++a;
continue;
}
print(list);
}
// 随机删除
int b = range(1, size);
while (b--)
{
int i = range(1, 10);
if (!linklist_delete(list, i, 0))
{
if (linklist_is_empty(list))
{
break;
}
++b;
continue;
}
print(list);
}
linklist_destroy(list);
}
return 0;
}
循环链表的表示和实现
最新推荐文章于 2022-10-05 13:08:38 发布