一些宏定义
# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0
结构体的实现
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
<1>初始化线性表
<2>销毁线性表
<3>清空线性表
<4>判定线性表是否为空
<5>返回线性表数据元素个数
<6>用e返回L中第i个数据元素的值
<7>返回L中第1个与e满足关系的数据元素的位序
<8>查找前驱
<9>查找后继
<10>在L中第i个位置之前插入新的数据元素e,L的长度加1
<11>删除L的第i个数据元素,并用e返回其值,L的长度减1
<12>依次对L的每个数据元素输出
<1>初始化线性表
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(*L==NULL) /* 存储分配失败 */
return ERROR;
(*L)->next=NULL; /* 指针域为空 */
return OK;
}
<2>销毁线性表
void DestroyList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
free(*L); /* 清空头节点 */
return OK;
}
<3>清空线性表
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /*只留下头节点,其余释放*/
return OK;
}
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /*只留下头节点,其余释放*/
return OK;
}
清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用
<4>判定线性表是否为空
Status ListEmpty(LinkList L)
{
if (L->next==NULL)
return TRUE;
else
return FALSE;
}
<5>返回线性表数据元素个数
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
<6>用e返回L中第i个数据元素的值
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
return i;
}
Status 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;
}
<7>返回L中第1个与e满足关系的数据元素的位序
Status 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;
}
Status LocateElem(LinkList L,ElemType e)
{
int i = 0;
LinkList p=L->next;
while(p)
{
i++;
if (p->data!=e)
p=p->next;
else
break;
}
if (i>0&&i<ListLength(L))
return i;
else
{
printf("查找失败!");
return FALSE;
}
}
<8>查找前驱
Status LocateElem(LinkList L,ElemType e)
{
int i = 0;
LinkList p=L->next;
while(p)
{
i++;
if (p->data!=e)
p=p->next;
else
break;
}
if (i>0&&i<ListLength(L))
return i;
else
{
printf("查找失败!");
return FALSE;
}
}
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LinkList p=L->next;
if (cur_e==p->data)
{
printf("不存在前驱!");
return ERROR;
}
else
{
while(p)
{
if (p->next->data==cur_e)
{
pre_e=p->data;
break;
}
else
p=p->next;
}
}
if (!p)
{
printf("无此数据!");
return ERROR;
}
}
<9>查找后继
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LinkList p=L->next;
if (cur_e==p->data)
{
printf("不存在前驱!");
return ERROR;
}
else
{
while(p)
{
if (p->next->data==cur_e)
{
pre_e=p->data;
break;
}
else
p=p->next;
}
}
if (!p)
{
printf("无此数据!");
return ERROR;
}
}
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList p=L->next;
while(p)
{
if (p->data==cur_e)
{
if (p->next!=NULL)
{
next_e=p->next->data;
break;
}
else
{
printf("不存在后继!");
return ERROR;
}
}
else
p=p->next;
}
if (!p)
{
printf("无此数据!");
return ERROR;
}
}
<10>在L中第i个位置之前插入新的数据元素e
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList p=L->next;
while(p)
{
if (p->data==cur_e)
{
if (p->next!=NULL)
{
next_e=p->next->data;
break;
}
else
{
printf("不存在后继!");
return ERROR;
}
}
else
p=p->next;
}
if (!p)
{
printf("无此数据!");
return ERROR;
}
}
Status ListInsert(LinkList *L,int i,ElemType e)
{
LinkList p,s;
p = *L;
int j = 0;
while (p && j < i-1) /* 寻找第i-1个结点 */
{
p = p->next;
++j;
}
if (!p || j > i-1)
return ERROR; /* 第i-1个元素不存在 */
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return OK;
}
<11>删除L的第i个数据元素,并用e返回其值
Status ListInsert(LinkList *L,int i,ElemType e)
{
LinkList p,s;
p = *L;
int j = 0;
while (p && j < i-1) /* 寻找第i-1个结点 */
{
p = p->next;
++j;
}
if (!p || j > i-1)
return ERROR; /* 第i-1个元素不存在 */
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return OK;
}
Status ListDelete(LinkList *L,int i,ElemType &e)
{
int j;
LinkList p,q;
p = *L;
j = 0;
while (p->next && j < i-1) /* 寻找前驱,即第i-1个元素 */
{
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;
}
<12>依次对L的每个数据元素输出
Status ListDelete(LinkList *L,int i,ElemType &e)
{
int j;
LinkList p,q;
p = *L;
j = 0;
while (p->next && j < i-1) /* 寻找前驱,即第i-1个元素 */
{
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;
}
void ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}