0
点赞
收藏
分享

微信扫一扫

循环链表(尾指针)

//循环链表(尾指针)
#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define TRUE 1
#define FLASE 0
#define ERROR 0

typedef struct elem {
int n;
}elem; //定义元素

typedef struct splist {
elem data;
splist* nest;
}splist,*list;

//创建并初始化链表
int InitList(list &L) {
L = (list)malloc(sizeof(splist));
if (L == NULL) return ERROR;
L->data.n = 0;
L->nest = L;
return OK;
}

//建立链表并添加元素
int CreateList(list &L) {
L = (list)malloc(sizeof(splist));
if (L == NULL) return ERROR;
L->nest = L;
list p;
int n = 0, m = 0;
printf("请输入要加入的元素个数:");
scanf("%d", &n);
while (n--) {
p = (list)malloc(sizeof(splist));
scanf("%d", &m);
p->nest = L->nest;
L->nest = p;
L = p;
p->data.n = m;
}
return OK;
}

//加入一个元素
int AddList(list &L,int i,int n){
if (i <= 0) return ERROR;
int j = 0;
list p = L->nest;
while(j<i-1 && p!=L) {
p = p->nest;
j++;
}
if (j < i-1) return ERROR;
list s = (list)malloc(sizeof(splist));
s->data.n = n;
s->nest = p->nest;
p->nest = s;
if (p == L) L = s;
return OK;
}

//删除一个结点
int DeleteList(list &L, int i) {
if (i <= 0) return ERROR;
int j = 0;
list p = L->nest;
while (j < i-1 && p->nest != L) {
p = p->nest;
j++;
}
if (j < i - 1) return ERROR;
list q = p->nest;
p->nest = q->nest;
if (q == L) L = p;
free(q);
return OK;
}

//求链表长度并返回元素个数
int LengthList(list &L) {
int i = 0;
list p = L->nest;
while (p != L) {
p = p->nest;
i++;
}
return i;
}

//判断链表是否为空
int EmptyList(list &L) {
if (L->nest == L) return TRUE;
return FLASE;
}

//将第i个结点的元素存到e中
int SearchList(list &L,int i, elem* e) {
if (i <= 0) return ERROR;
int j = 0;
list p = L->nest;
while (j < i && p != L) {
p = p->nest;
j++;
}
if (j < i) return ERROR;
e->n = p->data.n;
return OK;
}

//清空链表
int ClearList(list &L) {
list s = L->nest;//保留头结点
list p = L->nest->nest,q;
while (s->nest != s) {
q = p->nest;
L->nest->nest = q;
free(p);
p = q;
}
L = s;
return OK;
}

//销毁链表
int DestoryList(list &L) {
list s = L->nest;//保留头结点
list p = L->nest->nest, q;
while (s->nest != s) {
q = p->nest;
L->nest->nest = q;
free(p);
p = q;
}
L = s;
free(L);
return OK;
}

//将b连接在a的后面并释放b,直接在a上做改变
int ContactList(list &a, list &b) {
list s1 = b->nest, s2 = a->nest;//保留b和a的头结点
list p = b->nest->nest;
list q = NULL;
while (s1->nest != s1) {
q = p->nest;
a->nest = p;
p->nest = s2;
a = p;
s1->nest = q;
p = q;
}
b = NULL;
free(s1);
return OK;
}

int main()
{
return 0;
}
举报

相关推荐

0 条评论