代码只进行了简单的测试 如果代码存在问题 欢迎各位带哥在评论区指出
数据结构
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode, *CLinkList;
单链表的原子操作实现
1.创建循环单链表
Status ListCreate_CL(CLinkList &L, LNode* &tail, int n)
{
//创建一个长度为n的带有头结点的空链表
LNode *p;
L = (LNode *)malloc(sizeof(LNode));
L->next = L;
p = L;
for(int i = 0; i<n; i++)
{
p->next = (LNode *)malloc(sizeof(LNode));
p = p->next;
//scanf("%d", &p->data);
p->data = i;
}
p->next = L; //表尾指向表头
tail = p;
return OK;
}
2.删除循环链表
Status ListDestroy_CL(CLinkList &L, LNode* &tail)
{
//删除链表
LNode *p = L, *q = p;
while(p != tail)
{
p = p->next;
free(q);
q = p;
}
free(tail);
L = NULL;
tail = NULL;
return OK;
}
3.插入元素
Status ListInsert_CL(CLinkList &L, LNode* &tail, int n, ElemType e)
{
//定位到第n-1个结点,在其后插入一个新开辟的结点.
LNode *p=L->next;
int i=0;
while(p != L && i< n) //定位到第n-1个结点
{
p = p->next;
i++;
}
if(p == L || n<0) //第n-1个节点不存在或者n<0
return ERROR;
LNode *q;
q = (LNode *) malloc(sizeof(LNode));
if(!q)
exit(OVERFLOW);
if(p == tail) //更新表尾
tail = q;
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
4.追加元素
Status ListAppend_CL(CLinkList &L, LNode* &tail, ElemType e)
{
//在链表尾追加e节点
LNode *p=tail;
if(!p) //为空表创建头结点
{
L = (LNode *)malloc(sizeof(LNode));
L->next = L;
p = L;
}
LNode *q;
q = (LNode *) malloc(sizeof(LNode));
if(!q)
exit(OVERFLOW);
q->data = e;
q->next = p->next;
p->next = q;
tail = q;
return OK;
}
5.删除元素
Status DeleteElem_CL(CLinkList &L, LNode* &tail, int n, ElemType &e)
{
//L为带头结点的单链表的头指针。
//第n个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p = L->next, *q = L;
int i = 0;
while(p != L && i<n) //找到待删除节点以及其前驱节点
{
p = p->next;
q = q->next;
i++;
}
if(p ==L || n<0) //第n个元素不存在 或 n<0
return ERROR;
if(p == tail)
tail = q;
q->next = p->next; //将待删除节点从链表断开
e = p->data;
free(p); //删除节点
return OK;
}
6.获取元素
Status GetElem_CL(CLinkList L,int n,ElemType &e)
{
//L为带头结点的单链表的头指针。
//第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p = L->next;
int i = 0;
while(p != L && i<n)
{
p = p->next;
i++;
}
if(p == L || n<0) //第n个元素不存在 或 n<0
return ERROR;
e = p->data;
return OK;
}
7.获取链表长度
int ListLength_CL(CLinkList L)
{
if(!L)
return 0;
LNode *p = L->next;
int n = 0;
while(p != L)
{
p=p->next;
n++;
}
return n;
}