typedef int ElemType;
typedef struct DNode{
ElemType data;
struct DNode *prior;
struct DNode *next;
}DLinkNode;
建立
1)头插法
void CreateDListL(DLinkNode*& L, ElemType a[], int n)
{
DLinkNode* s;
L = (DLinkNode*)malloc(sizeof(DLinkNode));//重置
L->prior = NULL;
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = (DLinkNode*)malloc(sizeof(DLinkNode));
s->data = a[i];
s->next = L->next;
if (L->next != NULL)
L->next->prior = s;
s->prior = L;
L->next = s;
}
}
2)尾插法
void CreateDListR(DLinkNode*& L, ElemType a[], int n)
{
DLinkNode* s, * r;
L = (DLinkNode*)malloc(sizeof(DLinkNode));//重置
L->prior = NULL;
L->next = NULL;
r = L;
for (int i = 0; i < n; i++)
{
s = (DLinkNode*)malloc(sizeof(DLinkNode));
s->data = a[i];
s->prior = r;
r->next = s;
r = s;
}
r -> next = NULL;
}
初始化
void InitList(DLinkNode*& L)
{
L = (DLinkNode*)malloc(sizeof(DLinkNode));
L->prior = NULL;
L->next = NULL;
}
销毁
void DestroyList(DLinkNode*& L)
{
DLinkNode* pre=L, * p = L->next;//头结点保留下来 =L->next
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
判空
bool ListEmpty(LinkNode *L)
{
return (L->next==NULL);
}
求长
int ListLength(LinkNode *L)
{
int i=0;
LinkNode *s=L;
while(s->next!=NULL)
{
i++;
s=s->next;
}
return i;
}
输出线性表
void DispList(DLinkNode* L)
{
DLinkNode* s = L->next;//头结点不输出
while (s != NULL)
{
cout << s->data << " ";
s = s->next;
}
cout << endl;
}
按位置求值
int LocateElem(DLinkNode* L, ElemType e)
{
DLinkNode* s = L->next;//next
int i = 1;//i=1
while (s != NULL && s->data != e)
{
i++;
s = s->next;
}
if (s != NULL)
return 0;
else
return i;
}
按值查找
bool GetItem(DLinkNode* L, int i, ElemType& e)
{
if (i<=0) return false;
DLinkNode* s = L;
int j = 0;
while (s != NULL && j < i - 1)
{
j++;
s = s->next;
}
if (s == NULL)
return false;
else
{
e = s->data;
return true;
}
}
插入
bool ListInsert(DLinkNode*& L, int i, ElemType e)
{
if (i <= 0) return false;
int j = 0;
DLinkNode* s = L, * p;
while (s != NULL && j < i-1)
{
j++;
s = s->next;
}
if (s == NULL) return false;
else
{
p = (DLinkNode*)malloc(sizeof(DLinkNode));
p->data = e;
p->next = s->next;
if(p->next!=NULL)
s->next->prior = p;
s->next = p;
p->prior = s;
return false;
}
}
删除
bool ListDelete(DLinkNode*& L, int i, ElemType& e)
{
if (i <= 0) return false;
int j = 0;
DLinkNode* s = L, * p;
while (s != NULL && j < i)
{
j++;
s = s->next;
}
if (s == NULL)
return false;
else
{
p = s->next;
if (p == NULL)//判
return false;
e = p->data;
p->next->prior = s;
s->next = p->next;
free(p);
return true;
}
}
附循环链表:
非循环链表-判断p->next==NULL; 来看是否到尾结点
循环链表-判断p->next==L; 来看是否到尾结点