#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define BI_WAY_CIRCULATORY_CHAIN_TABLE_WITH_HEAD_NODE
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;
#ifdef ONE_WAY_CIRCULATORY_CHAIN_TABLE_WITH_HEAD_NODE
/* 线性表的单链表存储结构 */
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */
/* 构造一个空的、单向循环链表L */
Status InitList_CL(LinkList *L)
{
*L = (LinkList)malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
if (!*L) /* 存储分配失败 */
{
exit(0);
}
(*L)->next = *L; /* 指针域指向头结点 */
return OK;
}
/* 若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty_CL(LinkList L)
{
if (L->next == L) /* 表尾指针所指元素的next值 等于 自身 */
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 返回L中数据元素个数 */
int ListLength_CL(LinkList L)
{
int i = 0;
LinkList p = L->next; /* p指向头结点 */
while (p != L) /* 没到表尾 */
{
++i;
p = p->next;
}
return i;
}
/* 在L的第i个位置插入元素e */
Status ListInsert_CL(LinkList *L, int i, ElemType e) /* 改变L */
{
LinkList p = (*L)->next, s; /* p指向头结点 */
int j = 0;
if (i<1 || (i>ListLength_CL(*L) + 1)) /* 无法在第i个位置插入 */
{
return ERROR;
}
while (j < (i - 1)) /* 寻找第i-1个结点 */
{
p = p->next;
++j;
}
s = (LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
/* 在第i个位置插入L中 */
s->data = e;
s->next = p->next;
p->next = s;
/* 改变尾结点 */
if (p == *L)
{
*L = s;
}
return OK;
}
/* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
Status GetElem_CL(LinkList L, int i, ElemType *e)
{
int j = 1; /* 初始化,j为计数器 */
LinkList p = L->next->next; //由于L为带表头的、单向循环链表的表尾指针,所以p为第一个有效结点
if ((i < 1) || i > ListLength_CL(L)) /* 第i个元素不存在 */
{
return ERROR;
}
while (j<i)
{ /* 顺指针向后查找,直到p指向第i个元素 */
p = p->next;
++j;
}
*e = p->data; /* 取第i个元素 */
return OK;
}
/* 在L的第i个位置删除元素 */
Status ListDelete_CL(LinkList *L, int i)
{
LinkList p = (*L)->next, s; /* 由于L为带表头的、单向循环链表的表尾指针,所以p指向头结点 */
int j = 0;
if (i<1 || i>ListLength_CL(*L)) /* 无法删除第i个位置上的元素 */
{
return ERROR;
}
while (j < (i - 1)) /* 寻找第i-1个结点 */
{
p = p->next;
++j;
}
/* 删除第i个位置上的元素 */
s = p->next;
p->next = s->next;
/* 改变尾结点 */
if (s == *L)
{
*L = p;
}
free(s);
return OK;
}
/* 销毁线性表L */
Status DestroyList_CL(LinkList *L)
{
LinkList q, p = (*L)->next; /* 由于L为带表头的、单向循环链表的表尾指针,p指向头结点 */
while (p != *L) /* 没到表尾 */
{
q = p->next;
free(p);
p = q;
}
free(*L);
*L = NULL;
return OK;
}
/* 将L重置为空表 */
Status ClearList_CL(LinkList *L)
{
LinkList p, q;
*L = (*L)->next; /* 由于L为带表头的、单向循环链表的表尾指针,其后继结点为头结点 */
p = (*L)->next; /* p指向第一个结点 */
while (p != *L) /* 没到表尾 */
{
q = p->next;
free(p);
p = q;
}
(*L)->next = *L; /* 头结点指针域指向自身 */
return OK;
}
int main()
{
LinkList L,Lb;//带头节点的、单向循环链表的表尾指针
ElemType e;
int j;
Status i;
/* 初始化单循环链表L */
i = InitList_CL(&L);
if (i == OK)
{
printf("初始化单循环链表成功.\n");
}
else
{
printf("初始化单循环链表失败!\n");
return 1;
}
i = ListEmpty_CL(L);
if (i == OK)
{
printf("单循环链表为空.\n");
}
else
{
printf("单循环链表非空!\n");
}
ListInsert_CL(&L, 1, 3); /* 在L中第1个位置插入3 */
ListInsert_CL(&L, 2, 5); /* 在L中第2个位置插入5 */
ListInsert_CL(&L, 3, 7); /* 在L中第2个位置插入5 */
/* 获取第1个位置的元素 */
i = GetElem_CL(L, 1, &e);
if (i == OK)
{
printf("L中第%d个元素的值为%d。\n", 1, e);
}
else
{
printf("未能获取L中第%d个元素,请检查!\n", 1);
return 1;
}
/* 返回L中数据元素个数 */
j = ListLength_CL(L);
printf("L中数据元素个数=%d。\n", j);
printf("L中的数据元素依次为:");
/* 在L的第1个位置删除元素 */
j = 3;
i = ListDelete_CL(&L, j);
if (i == OK)
{
printf("\n单循环链表成功删除第%d个元素.\n", j);
}
else
{
printf("\n单循环链表删除第%d个元素失败!\n", j);
return 1;
}
/* 返回L中数据元素个数 */
j = ListLength_CL(L);
printf("L中数据元素个数=%d。\n", j);
printf("L中的数据元素依次为:");
/* 将L重置为空表 */
i = ClearList_CL(&L);
if (i == OK)
{
printf("\n已经重置单循环链表\n");
}
/* 返回L中数据元素个数 */
j = ListLength_CL(L);
printf("重置后,L中数据元素个数=%d。\n", j);
/* 销毁单循环链表 */
i = DestroyList_CL(&L);
if (i == OK)
{
printf("已经销毁单循环链表,链表尾指针已经置为%0x.\n", L);
}
////////////////////////////////////////////////////////
////测试链表合并
i = InitList_CL(&L);
if (i == OK)
{
printf("初始化单循环链表成功.\n");
}
else
{
printf("初始化单循环链表失败!\n");
return 1;
}
ListInsert_CL(&L, 1, 3); /* 在L中第1个位置插入3 */
ListInsert_CL(&L, 2, 5); /* 在L中第2个位置插入5 */
ListInsert_CL(&L, 3, 7); /* 在L中第2个位置插入5 */
i = InitList_CL(&Lb);
if (i == OK)
{
printf("初始化单循环链表成功.\n");
}
else
{
printf("初始化单循环链表失败!\n");
return 1;
}
ListInsert_CL(&Lb, 1, 2); /* 在L中第1个位置插入3 */
ListInsert_CL(&Lb, 2, 4); /* 在L中第2个位置插入5 */
ListInsert_CL(&Lb, 3, 6); /* 在L中第2个位置插入5 */
printf("\n");
return 0;
}
#endif
#ifdef BI_WAY_CIRCULATORY_CHAIN_TABLE_WITH_HEAD_NODE
typedef struct DuLNode
{
ElemType data;
struct DuLNode *prior, *next;
}DuLNode, *DuLinkList;
/* 产生空的、带头结点的、双向链表L */
Status InitList(DuLinkList *L)
{
*L = (DuLinkList)malloc(sizeof(DuLNode));
if (*L)
{
(*L)->next = (*L)->prior = *L;
return OK;
}
else
{
return OVERFLOW;
}
}
/* 将带头结点的、双向循环链表L重置为空表 */
Status ClearList(DuLinkList L) /* 不改变L */
{
DuLinkList q, p = L->next; /* p指向第一个结点 */
while (p != L) /* p没到表头 */
{
q = p->next;
free(p);
p = q;
}
L->next = L->prior = L; /* 头结点的两个指针域均指向自身 */
return OK;
}
/* 返回带头结点的、双向链表L中数据元素个数 */
int ListLength(DuLinkList L)
{
int i = 0;
DuLinkList p = L->next; /* p指向第一个结点 */
while (p != L) /* p没到表头 */
{
++i;
p = p->next;
}
return i;
}
/* 在带头结点的、双向链表L中返回第i个元素的位置指针 */
DuLinkList GetElemP(DuLinkList L, int i)
{
int j;
DuLinkList p = L;
for (j = 1; j <= i; ++j)
{
p = p->next;
}
return p;
}
/* 在带头结点的、双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长+1 */
Status ListInsert(DuLinkList L, int i, ElemType e)
{
DuLinkList p, s;
if (i<1 || i>ListLength(L) + 1) /* i值不合法 */
{
return ERROR;
}
p = GetElemP(L, i - 1); /* 在L中确定第i-1个元素的位置指针p */
if (!p) /* p=NULL,即第i-1个元素不存在 */
{
return ERROR;
}
s = (DuLinkList)malloc(sizeof(DuLNode)); //申请新结点的内存
if (!s)
{
return OVERFLOW;
}
s->data = e; /* 在第i-1个元素之后插入 */
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
return OK;
}
/* 若带头节点的、双向循环链表L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(DuLinkList L)
{
if (L->next == L && L->prior == L)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* ListTraverse()调用的函数(类型一致) */
void vd(ElemType c)
{
printf("%d ", c);
}
void main()
{
DuLinkList L;
int i, n = 2;
ElemType e;
InitList(&L); /* 产生空的、带头节点的、双向循环链表L */
printf("初始化链表,依次输入1,2,3,4,5\n");
for (i = 1; i <= 5; ++i)
{
ListInsert(L, i, i); /* 在第i个结点之前插入i */
}
if (ListEmpty(L))
{
printf("清空前:链表为空.\n");
}
else
{
printf("清空前:链表非空,长度为%d.\n",ListLength(L));
}
ClearList(L); /* 清空链表 */
if (ListEmpty(L))
{
printf("清空后:链表为空.\n");
}
else
{
printf("清空后:链表非空,长度为%d.\n", ListLength(L));
}
}
#endif
循环链表作业(04次)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这8种学生永远拿不到高分!早看早受益! 下面是一位资深班主任总结了8种成绩提不上去的原因,分别对应8类孩子,如果你...
- 这8种学生永远拿不到高分!早看早受益! 下面是一位资深班主任总结了8种成绩提不上去的原因,分别对应8类孩子,如果你...