关于本篇文章说明
文章中提到的操作很少,因为作者发现双链表的大部分操作可以仿作单链表进行或者利用
下文给出的几个基本操作。
文章中出现的指针变量(除head指针外)皆为中间指针变量
文章仅使用一个c语言中的函数printf,并不会影响阅读。
关于链表长度,代码中则是设置了全局变量len,并没有采用头指针指向长度的方式。
如同上一篇单链表一样,本文中的代码并没有进行类的封装,等到作者开学后会补上。
双链表结构单元
在双链表的结构单元中,num为结构单元携带的数值,next指针则指向下一个结构单元,而pre指针则指向上一个结构单元。
typedef struct node
{
int num;
struct node* next;
struct node* pre;
}student;
双链表的创建
双链表的创建也可以分为头插法和尾插法,但由于和单链表极其相似,因此在本文不多加叙述。
尾插法
student* createList()
{
printf("请输入链表长度:");
cin >> len;
student* head = new student;
head->next = NULL; head->pre = NULL;
student* r = head;
for (int i = 0; i < len; i++)
{
student* p = new student;
printf("请输入%d节点的值:",i+1);
cin >> p->num;
p->next = NULL;
r->next = p;
p->pre = r;
r = p;
}
return head;
}
双链表的输出
void display(student* head)
{
student* p = head;
cout << endl;
for (int i = 0; i < len; i++)
{
p = p->next;
if (i != 0)
cout << " --> ";
cout << p->num;
}
cout << endl;
}
双链表的插入
void input(student* head)
{
int num;
student* n = head;
student* p = new student; len++;
printf("请输入插入数值:");
cin >> p -> num;
printf("请输入插入的节点值(%d,%d):",1,len);
cin >> num;
for (int i = 0; i < num-1; i++)
n = n->next;
p->next = n->next;
if(n->next)
n->next->pre = p;
n->next = p;
p->pre = n;
}
双链表的删除
删除节点
void delet_point(student* head)
{
int n;
printf("请输入要删除的节点数:");
cin >> n;
student* r = head, * p = head->next;
for (int i = 0; i < n-1; i++)
{
r = r->next;
p = p->next;
}
r->next = p->next;
if(p->next)
p->next->pre = r;
delete p; len--;
}
删除数值
void delet_num(student* head)
{
int num, a = 1;
printf("请输入想要删去的值");
cin >> num;
student* p = head, * r = head;
for (int i = 0; i < len; i++)
{
p = r;
p = p->next;
if (p->num == num)
{
a = 0;
r->next = p->next;
if (p->next)
p->next->pre = r;
delete p; len--;
}
}
if (a)
printf("链表中不存在该数值.");
}
双链表的排序(选择排序)
这里其实和单链表一样…
void sort(student* head)
{
student* r = head->next, * p = r, * t = r;
int tem = 0;
for (int i = 0; i < len; i++)
{
t = r;
for (int j = i; j < len; j++)
{
if (r->num > p->num)
t = p;
p = p->next;
}
tem = r->num; r->num = t->num; t->num = tem;
r = r->next;
p = r;
}
}
补充
双链表的反转
关于双链表的反转可以参考单链表的反转,万变不离其宗,双链表和单链表本质上是相通
的。
双链表的排序
其实作者上文对于双链表的排序以及之前的文章中对于单链表的排序是不好的,因为这种排
序没有进行节点的排序,只是交换了节点中的数值。