[数据结构(二)]线性表链式存储的C语言实现

时间:2021-04-30 10:14:52

内容:

1)初始化

2)求一个线性表的长度

3)线性表插入新的元素

4)依次输出整个线性表

5)判断线性表是否是空表

6)清空线性表

7)返回线性表中第i个数据元素的值

8)返回与某个数据元素相等的位置顺序

9)删除掉某个数据元素

10)头插法

11)尾插法

 

1.1 初始化

 /* 初始化顺序线性表 */
int InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if (!(*L)) /* 存储分配失败 */
return ERROR;
(
*L)->next = NULL; /* 指针域为空 */
return OK;
}

(1)函数malloc()

功能:分配长度为num_bytes字节的内存块。

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

2)函数sizeof()

计算对象所占的字节数,通常用来查看变量、数组或结构体等所占的字节个数。

1.2 求一个线性表的长度

int ListLength(LinkList L)
{
int i = 0;
LinkList p
= L->next; /* p指向第一个结点 */
while (p)
{
i
++;
p
= p->next;
}
return i;
}

1.3 线性表插入新的元素

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
int ListInsert(LinkList *L, int i, ElemType e)
{
int j;
LinkList p, s;
p
= *L;
j
= 1;
while (p && j < i) /* 寻找第i个结点 */
{
p
= p->next;
++j;
}
if (!p || j > i)
return ERROR; /* 第i个元素不存在 */
s
= (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */
s
->data = e;
s
->next = p->next; /* 将p的后继结点赋值给s的后继 */
p
->next = s; /* 将s赋值给p的后继 */
return OK;
}

1.4 依次输出整个线性表

/* 操作结果:依次对L的每个数据元素输出 */
int ListTraverse(LinkList L)
{
LinkList p
= L->next;
while (p)
{
visit(p
->data);
p
= p->next;
}
printf(
"\n");
return OK;
}

 

visit()为自定义函数

int visit(int c)

{

    printf("%d ", c);

    return OK;

}

 

1.5 判断线性表是否是空表

int ListEmpty(LinkList L)
{
if (L->next)
return FALSE;
else
return TRUE;
}

1.6 清空线性表

int ClearList(LinkList *L)
{
LinkList p, q;
p
= (*L)->next; /* p指向第一个结点 */
while (p) /* 没到表尾 */
{
q
= p->next;
free(p);
p
= q;
}
(
*L)->next = NULL; /* 头结点指针域为空 */
return OK;
}

1.7 返回线性表中第i个数据元素的值

/* 操作结果:用e返回L中第i个数据元素的值 */
int GetElem(LinkList L, int i, ElemType *e)
{
int j;
LinkList p;
/* 声明一结点p */
p
= L->next; /* 让p指向链表L的第一个结点 */
j
= 1; /* j为计数器 */
while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */
{
p
= p->next; /* 让p指向下一个结点 */
++j;
}
if (!p || j>i)
return ERROR; /* 第i个元素不存在 */
*e = p->data; /* 取第i个元素的数据 */
return OK;
}

1.8 返回与某个数据元素相等的位置顺序

/* 操作结果:返回L中第1个与e满足关系的数据元素的位序;不存在,则返回值为0 */
int LocateElem(LinkList L, ElemType e)
{
int i = 0;
LinkList p
= L->next;
while (p)
{
i
++;
if (p->data == e) /* 找到这样的数据元素 */
return i;
p
= p->next;
}

return 0;
}

1.9 删除掉某个数据元素

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
int ListDelete(LinkList *L, int i, int *e)
{
int j;
LinkList p, q;
p
= *L;
j
= 1;
while (p->next && j < i) /* 遍历寻找第i个元素 */
{
p
= p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /* 第i个元素不存在 */
q
= p->next;
p
->next = q->next; /* 将q的后继赋值给p的后继 */
*e = q->data; /* 将q结点中的数据给e */
free(q); /* 让系统回收此结点,释放内存 */
return OK;
}

1.10 头插法

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(
0)); /* 初始化随机数种子 */
*L = (LinkList)malloc(sizeof(Node));
(
*L)->next = NULL; /* 先建立一个带头结点的单链表 */
for (i = 0; i<n; i++)
{
p
= (LinkList)malloc(sizeof(Node)); /* 生成新结点 */
p
->data = rand() % 100 + 1; /* 随机生成100以内的数字 */
p
->next = (*L)->next;
(
*L)->next = p; /* 插入到表头 */
}
}

1.11 尾插法

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{
LinkList p, r;
int i;
srand(time(
0)); /* 初始化随机数种子 */
*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */
r
= *L; /* r为指向尾部的结点 */
for (i = 0; i<n; i++)
{
p
= (Node *)malloc(sizeof(Node)); /* 生成新结点 */
p
->data = rand() % 100 + 1; /* 随机生成100以内的数字 */
r
->next = p; /* 将表尾终端结点的指针指向新结点 */
r
= p; /* 将当前的新结点定义为表尾终端结点 */
}
r
->next = NULL; /* 表示当前链表结束 */
}