1.單鏈表的反轉
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LNode* LinkList;
typedef struct LNode{
ElemType data;
LinkList next;
}LNode;
//初始化
void InitList(LinkList &L){
L = new LNode;
L->next = NULL;
return;
}
//插入
void InsertList(LinkList &L, ElemType e){
if (!L){
InitList(L);
L->data = e;
return;
}
else{
InsertList(L->next, e);
}
}
//反轉
void ReverseList(LinkList &L){
LinkList q = NULL, p;//p是當前節點;q是p的前驅
while (L){
p = L;
L = L->next;
p->next = q;
q = p;
}
L = p;//這樣p永遠是表頭
return;
}
//輸出
void OutputList(LinkList L){
if (!L){ printf("空\n"); return; }
while (L){
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return;
}
int main(){
LinkList L = NULL;
int n;
ElemType t;
scanf("%d", &n);
while (n--){
scanf("%d", &t);
InsertList(L, t);
}
OutputList(L);
ReverseList(L);
OutputList(L);
return 0;
}
1.0結構體
typedef int ElemType;
typedef struct LNode* LinkList;
typedef struct LNode{
ElemType data;
LinkList next;
}LNode;
1.1初始化
void InitList(LinkList &L){
L = new LNode;
L->next = NULL;
return;
}
1.2插入
void InsertList(LinkList &L, ElemType e){
if (!L){
InitList(L);
L->data = e;
return;
}
else{
InsertList(L->next, e);
}
}
1.3反轉
void ReverseList(LinkList &L){
LinkList q = NULL, p;//p是當前節點;q是p的前驅
while (L){
p = L;
L = L->next;
p->next = q;
q = p;
}
L = p;//這樣p永遠是表頭
return;
}
1.4輸出
void OutputList(LinkList L){
if (!L){ printf("空\n"); return; }
while (L){
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return;
}
2.雙向鏈表
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct LNode *LinkList;
typedef struct LNode{
ElemType data;
LinkList next, previous;
}LNode;
//初始化
void InitList(LinkList &L){
L = new LNode;
L->previous = NULL;
L->next = NULL;
return;
}
//插入
void InsertList(LinkList &L, ElemType e){
if (!L){
InitList(L);
L->data = e;
}
else{
InsertList(L->next, e);
L->next->previous = L;
}
}
//翻轉
void ReverseList(LinkList &L){
if (!L){return; }
LinkList p, q = NULL, t;//p代表當前點,q是p的前驅,t是p的後導
while (L){
p = L;
L = L->next;
t = L;
p->previous = t;
p->next = q;
q = p;
}
L = p;//L已經是NULL,p是一開始的尾節點,現在是頭結點
return;
}
//輸出
void OutputList(LinkList L){
if (!L){ printf("空\n"); return; }
while (L){
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return;
}
int main(){
int n;
printf("表長:");
scanf("%d", &n);
LinkList L=NULL, f = NULL;
ElemType e;
while (n--&&n>=0){
scanf("%d", &e);
InsertList(L, e);
}
OutputList(L);
ReverseList(L);
printf("翻轉:");
OutputList(L);
system("pause");
return 0;
}
2.0結構體
typedef int ElemType;
typedef struct LNode *LinkList;
typedef struct LNode{
ElemType data;
LinkList next, previous;
}LNode;
2.1初始化
void InitList(LinkList &L){
L = new LNode;
L->previous = NULL;
L->next = NULL;
return;
}
2.2插入
利用了初始化,遇空樹則初始化
注意遞歸返回上一層函數時,要掛接L->next的前驅,因爲在初始化並賦值L->next的過程中,它的previous是指向NULL而不是L的
void InsertList(LinkList &L, ElemType e){
if (!L){
InitList(L);
L->data = e;
}
else{
InsertList(L->next, e);
L->next->previous = L;
}
}
2.3反轉
void ReverseList(LinkList &L){
if (!L){return; }
LinkList p, q = NULL, t;//p代表當前點,q是p的前驅,t是p的後導
while (L){
p = L;
L = L->next;
t = L;
p->previous = t;
p->next = q;
q = p;
}
L = p;//L已經是NULL,p是一開始的尾節點,現在是頭結點
return;
}
2.4輸出
void OutputList(LinkList L){
if (!L){ printf("空\n"); return; }
while (L){
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return;
}