#include<stdio.h>
#include<iostream>
using namespace std;
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
//采用头插法建立双链表
void createlistf(Node*& l, int s[], int n) {
int no = n - 1;//由于是头插法,若no从0开始则编号为倒序,故从n-1开始递减
Node* head;
l = (Node*)malloc(sizeof(Node));
l->prev = l->next = NULL;
for (int i = 0; i < n; i++) {
head = (Node*)malloc(sizeof(Node));
head->data = s[i];//给data赋值
head->next = l->next;//使head结点的下一节点为头结点l的下一节点
if (l->next != NULL)//若头结点的下一节点不为空
l->next->prev = head;//则让其prev指针指向head
head->prev = l;//令head的prev指针指向头结点
l->next = head;//最后再改变l的next指针指向,让其指向head
}
}
void printList(Node* head) {
Node* temp = head->next;//指向首结点
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
// 冒泡排序函数(最后从小到大排序)
void bubblesort(Node*& l) {
int lnum, rnum;//左端点序号和右端点序号
lnum = 0;
Node* l0 = l;
int no = -1;
while (l0->next != NULL) {
l0 = l0->next; no++;
}//遍历双链表直到最后一个节点
rnum = no;//得到最右端序号
int n = rnum + 1;//记录下双链表长度
Node* L1 = l->next;//L1为双链表首结点
Node* L2 = l0;//L2为双链表尾结点
cout << l0->data;
while (lnum <= rnum)//该循环的终止条件为左端点序号超过右端点序号
{
Node* l1=L1; //每次循环都建立l1,l2储存L1,L2的位置
while (l1->next != L2->next)//l1从前往后遍历,直到来到L2结点
{
int temp;
if (l1->data > l1->next->data)
{
temp = l1->data;
l1->data = l1->next->data;
l1->next->data = temp;
}//交换
l1 = l1->next;//前往后一节点
}printList(l);
L2 = L2->prev;
Node* l2 = L2;
while (l2->prev != L1->prev)//l2从后往前遍历,直到来到L1结点
{
int temp;
if (l2->data < l2->prev->data) {
temp = l2->data;
l2->data = l2->prev->data;
l2->prev->data = temp;
}
//交换
l2 = l2->next;//前往前一节点
}lnum++; rnum++;
L1 = L1->next;
}
}
int main() {
Node* head = NULL;
int a[] = { 12,25,15,35,675,1,9,6 };
createlistf(head, a, 8);
printf("Original list:\n");
printList(head);
bubblesort(head);
printList(head);
}
为什么L2赋值给l2结果显示l2为nullper??