// 2014年4月14日
// 线性表的链式表示与实现
// 稍微修改了一下,用头结点来存储链表的长度
//
// 存储格式
// list
// ↓
// [data][next] -> [data][next] -> [data][next] -> ... [data][0]
// head node node 0 node 1 end node
//
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
typedef int element_t;
typedef struct node_t
{
element_t data;
struct node_t *next;
} node_t, *linklist_t;
void linklist_init(linklist_t& list)
{
list = (linklist_t)malloc(sizeof(node_t));
assert(list);
list->data = 0;
list->next = 0;
}
void linklist_clear(linklist_t& list)
{
node_t *p = list->next;
while (p != 0)
{
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_is_empty(linklist_t &list)
{
return 0 == list->data;
}
bool linklist_insert(linklist_t& list, int n, element_t& e)
{
int i = 0;
node_t *p = list;
if ((n < 1) || (n > linklist_length(list)+1))
{
return false;
}
while (i < n-1)
{
++i;
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 n, element_t *e)
{
int i = 0;
node_t *p = list;
if ((n < 1) || (n > linklist_length(list)))
{
return false;
}
while (i < n-1)
{
++i;
p = p->next;
}
node_t *q = p->next;
p->next = q->next;
if (e != 0)
{
*e = q->data;
}
free(q);
--list->data;
return true;
}
void print(linklist_t& list)
{
for(node_t *p = list->next; p != 0; p = p->next)
{
printf("%02d ", p->data);
}
printf("\n");
}
int range(int a, int b)
{
assert(a>0);
assert(b>0);
return rand()%b + a;
}
int main()
{
int n = 10;
int size = 10;
srand((unsigned)time(0));
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;
}
线性表的链式表示与实现
最新推荐文章于 2024-07-20 11:22:21 发布