/* 单链式存储结构中,只有一个指向后继的指针,从某点出发,只能顺序的访
访问,如果想访问上一个结点必须从头开始,时间复杂度:访问下一个结点
为O(1),访问上一个结点为O(n)而双向链表可以克服这个问题
双向链表的结点存在一个数据域和两个指针域:一个指向前驱一个指向后继 */
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
struct Node *prev;
}LinkNode, *LinkList;
void Init(LinkList *l);
void Insert(LinkList l, int i, ElemType e);
void Delete(LinkList l, int i, ElemType *e);
int LocateElem(LinkList l, ElemType e);
void GetElem(LinkList l, int i, ElemType *e);
void Print(LinkList l);
void Destroy(LinkList l);
void Init(LinkList *l)
{
(*l) = (LinkNode *)malloc(sizeof(LinkNode));
(*l)->data = 0; //头节点的data用来记录链表节点的数量
(*l)->next = NULL;
(*l)->prev = NULL;
}
void Insert(LinkList l, int i, ElemType e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data + 1)
return;
LinkNode *p = l;
while (--i)
p = p->next;
LinkNode *n = (LinkNode *)malloc(sizeof(LinkNode));
n->data = e;
if (p->next)
{
n->next = p->next;
n->prev = p;
p->next->prev = n;
p->next = n;
}
else
{
n->prev = p;
n->next = p->next;
p->next = n;
}
++l->data;
}
void Delete(LinkList l, int i, ElemType *e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data)
return;
LinkList p = l->next;
while (--i)
p = p->next;
LinkNode *temp = p;
*e = temp->data;
p->prev->next = p->next;
p->next->prev = p->prev;
free(temp);
--l->data;
}
int LocateElem(LinkList l, ElemType e)
{
if (l == NULL)
return -1;
LinkNode *p = l->next;
int i = 1;
while (p && p->data != e)
{
++i;
p = p->next;
}
if (p == NULL)
return -1;
return i;
}
void GetElem(LinkList l, int i, ElemType *e)
{
if (l == NULL)
return;
if (i < 1 || i > l->data)
return;
LinkNode *p = l->next;
while (--i)
p = p->next;
*e = p->data;
}
void Print(LinkList l)
{
if (l == NULL)
return;
LinkNode *p = l->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void Destroy(LinkList l)
{
while (l)
{
LinkNode *temp = l;
l = l->next;
free(temp);
}
}
int main()
{
LinkList l;
Init(&l); //初始化链表
for(int i = 1; i < 21; ++i)
Insert(l, 1, i);
printf("链表的元素为:\n");
Print(l);
printf("在第1个位置插入元素:0,插入后的链表元素为:\n");
Insert(l, 1, 0);
Print(l);
printf("在第11个位置删除元素后的链表为:\n");
int e;
Delete(l, 11, &e);
Print(l);
printf("被删除的元素为:%d\n",e);
printf("链表第10个位置的元素为: ");
GetElem(l, 10, &e);
printf("%d\n",e);
int k = 15;
if((e = LocateElem(l, k)) != -1)
printf("在链表的第%d个位置找到元素%d\n",e,k);
else
printf("在链表的中未找到元素:%d\n",k);
Destroy(l); //销毁链表
return 0;
}