代码只进行了简单的测试 如果代码存在问题 欢迎各位带哥在评论区指出
数据结构
typedef struct LNode{
struct LNode *pre;
ElemType data; //数据域
struct LNode *next; //指针域
}LNode, *DLinkList;
双向链表的原子操作实现
1.创建链表
Status ListCreate_DL(DLinkList &L, int n)
{
//创建一个长度为n的带有头结点的空链表
LNode *p;
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
L->pre = NULL;
p = L;
for(int i = 0; inext = (LNode *)malloc(sizeof(LNode));
p->next->pre = p;
p = p->next;
//scanf("%d", &p->data);
p->data = i;
}
p->next = NULL; //表尾赋空
return OK;
}
2.删除链表
Status ListDestroy_DL(DLinkList &L)
{
//删除链表
LNode *p = L, *q = p;
while(p)
{
p = p->next;
free(q);
q = p;
}
L = NULL;
return OK;
}
3.插入元素
Status ListInsert_DL(DLinkList &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->pre = q;
p->next = q;
q->pre = p;
return OK;
}
4.追加元素
Status ListAppend_DL(DLinkList &L, ElemType e)
{
//在链表尾追加e节点
LNode *p=L;
if(!p) //为空表创建头结点
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
L->pre = 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;
q->pre = p;
p->next = q;
return OK;
}
5.删除元素
Status DeleteElem_DL(DLinkList &L,int n,ElemType &e)
{
//L为带头结点的单链表的头指针。
//第n个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p = L->next;
int i = 0;
while(p && inext;
i++;
}
if(!p || n<0) //第n个元素不存在 或 n<0
return ERROR;
p->next->pre = p->pre; //将待删除节点从链表断开
p->pre->next = p->next;
e = p->data;
free(p); //删除节点
return OK;
}
6.获取元素
Status GetElem_DL(DLinkList L,int n,ElemType &e)
{
//L为带头结点的单链表的头指针。
//第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LNode *p = L->next;
int i = 0;
while(p && inext;
i++;
}
if(!p || n<0) //第n个元素不存在 或 n<0
return ERROR;
e = p->data;
return OK;
}
7.获得表长
int ListLength_DL(DLinkList L)
{
if(!L)
return 0;
LNode *p = L->next;
int n = 0;
while(p)
{
p=p->next;
n++;
}
return n;
}
8.打印表
void PrintList_DL(DLinkList L)
{
//打印链表
if(L == NULL || L->next == NULL)
{//空表打印
printf("Empty LinkList\n");
return;
}
LNode *p = L->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
完整代码