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