双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。
建立双向非循环链表代码如下:
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct dnode
{
int num;
struct dnode *pre;
struct dnode *next;
}dNode;
dNode * CreateDList(int a[], int n)
{
dNode *head, *p, *q;
head = (dNode*)malloc(sizeof(dNode));
head->pre = NULL;//(1)
head->next = NULL;//空的双向链表
p = head;
for(int i=0; i<n; i++)
{
q = (dNode*)malloc(sizeof(dNode));
q->num = a[i];//数组元素给链表赋值!!!
p->next = q;
q->pre = p; //(2)增加前驱指针的指向即可!!!
p = q;
}
p->next = NULL;//将最后一个结点的指针域清空
//p->pre = NULL;
return head;//返回这个链表的首地址
}
void PrintDList(dNode *head)
{
dNode *p;
p = head->next;//从第一个元素(头元素)开始,依次往后
while(p)
{
cout<<p->num<<" ";
p = p->next;
}
cout<<endl;
}
void ReversePrintDList(dNode *head)
{
dNode *p, *s;
p = head->next;
while(p)
{
s = p;//不断向后,最后赋给s的是链表最后一个元素!!!
p = p->next;
}
while(s)
{
if(s == head)
break;//!!!
cout<<s->num<<" ";
s = s->pre;
}
cout<<endl;
}
//插入
dNode *InsertDList(dNode *head, int i, int e, int n)
{
dNode *p, *q;
if(i<1 || i>n+1) cout<<"请输入正确插入位置!"<<endl;
p = head;
for(int j=0;j<i-1; j++)
{//(1)遍历找到插入节点的前一位置!!!
p = p->next;
}
q=(dNode*)malloc(sizeof(dNode));//(2)为要插入的结点分配内存空间
q->num = e;//(3)给要插入的节点数据赋值
//(4)执行插入!!!
q->next = p->next;
p->next->pre = q;
q->pre = p;
p->next = q;
n++;
//cout<<n<<endl;
return head;
}
//删除
dNode *DeleteDList(dNode *head, int i, int n)
{
dNode *p;
if(i<1 || i>n) cout<<"请输入正确删除位置!"<<endl;
p = head;
for(int j=0;j<i; j++)//!!!
{//(1)遍历找到要删除的节点!!!
p = p->next;
}
//执行删除,两种情况
//(1)最后一个节点
if(p->next == NULL)
{
p->pre->next = NULL;
free(p);
}
//(2)非最后一个节点
else
{
p->pre->next = p->next;
p->next->pre = p->pre;
free(p);
}
n--;
return head;
}
int main()
{
int a[]={1, 2, 3, 4};
dNode *head = CreateDList(a, 4);
PrintDList(head);//正序打印
ReversePrintDList(head);//逆序打印
head = InsertDList(head, 2, 20, 4);
PrintDList(head);
//临界点的删除
head = DeleteDList(head, 5, 5);//最后一个
PrintDList(head);
head = DeleteDList(head, 1, 4);//第一个
PrintDList(head);
return 0;
}
结果:
1 2 3 4
4 3 2 1
1 20 2 3 4
1 20 2 3
20 2 3
Process returned 0 (0x0) execution time : 0.054 s
Press any key to continue.