双向链表很多操作只需要在单链表的基础上稍作修改;下面来看看基本操作:
1、定义
typedef struct DNode{
int data;
struct DNode* next;
struct DNode* prior;
}DNode, *DLinkList;
2、插入
DLinkList DList_Head_Insert(DLinkList& DL)
{
int x;
DNode* s;
DL = (DNode*)malloc(sizeof(DNode));
DL->next = NULL;
DL->prior = NULL;
scanf("%d", &x);
while (x != 9999)
{
s = (DNode*)malloc(sizeof(DNode));
s->data = x;
s->next = DL->next;
if (DL->next)
DL->next->prior = s;
s->prior = DL;
DL->next = s;
scanf("%d", &x);
}
return DL;
}
DLinkList DList_Tail_Insert(DLinkList& DL)
{
DL = (DNode*)malloc(sizeof(DNode));
DL->next = NULL;
DL->prior = NULL;
int x;
DNode* s, * r;
r = DL;
scanf("%d", &x);
while (x != 9999)
{
s = (DNode*)malloc(sizeof(DNode));
s->data = x;
r->next = s;
s->prior = r;
r = s;
scanf("%d", &x);
}
r->next = NULL;
return DL;
}
两种插入的办法,头插和尾插;
3、打印链表里面的数据
void PrintDList(DLinkList DL)
{
DL = DL->next;
while (DL)
{
printf("%-3d",DL->data);
DL = DL->next;
}printf("\n");
}
4、得到链表中的第i个数据,返回指针
DLinkList GetElem(DLinkList DL,int site)
{
if (site == 0)
return DL;
if (site < 1)
return NULL;
DL = DL->next;
int i = 1;
while (DL && i++ < site)
DL = DL->next;
return DL;
}
5、在第i个位置插入
bool DList_Insert(DLinkList& DL,int site,int e)
{
if (DL == NULL)
return false;
DLinkList p = GetElem(DL, site - 1);
DNode* r = (DNode*)malloc(sizeof(DNode));
r->data = e;
r->next = p->next;
p->next->prior = r;
r->prior = p;
p->next = r;
return true;
}
6、删除第i个位置的元素
bool DList_Delete(DLinkList& DL, int site)
{
DLinkList p = GetElem(DL, site - 1);
if (p == NULL)
return false;
DNode* q = p->next;
if (q == NULL)
return false;
p->next = q->next;
q->next->prior = p;
free(q);
return true;
}
操作大概就这么多,可能有的操作的边界问题没有考虑到,就这样吧,依据实际情况而定。