您的位置:首页 > 理论基础 > 数据结构算法

《数据结构》双向链表的创建

2016-03-03 18:23 525 查看
双向链表的创建
双向链表的创建同样像单链表一样可以有两种方法:头插法和尾插法。

使用尾插法创建双向链表:

算法思想:

先定义一个指针q指向头结点

1.新结点p的前驱指向头结点L;

2.新结点的next指针域置空;

3.头结点的next指向p;

4.q指向p.

void CreateList1(DuLinkList &L,int n){
L=new DuLNode;
L->next=NULL;
L->prior=NULL;
struct DuLNode *q;
q=L;
printf("请输入链表元素:\n");
for(int i=0;i<n;i++){
printf("请输入第%d个元素的值:",i+1);
struct DuLNode *p;
p=new DuLNode;
scanf("%d",&p->data);
p->prior=q;
p->next=NULL;

q->next=p;
q=p;
}
}


头插法创建双向链表:

使用头插法创建双向链表时,一定要判断链表是否为空是否为空,因为链表为空时,L->next_prior是不存在的,这是y8ge空指针。

//头插法创建单链表
void CreateList(DuLinkList &L,int n){
L=new DuLNode;
L->next=NULL;
L->prior=NULL;
printf("请输入链表元素:\n");
struct DuLNode *p;
for(int i=n;i>0;--i){
printf("请输入第%d个元素值:",i);
struct DuLNode *s;
s=new DuLNode;
scanf("%d",&s->data);
s->next=L->next;
if(L->next!=NULL)//不加这一条if语句就错!!
//原因:当链表为空时,即只有一个头结点,则L->next为空,也就不存在后继;
//所以,下面的语句不能执行。
L->next->prior=s;
L->next=s;
s->prior=L;
}
}


//一般的双向链表

#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100

//定义双向链表
typedef struct DuLNode{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode,*DuLinkList;

//初始化双向链表
int InitList(DuLinkList &L){
L=new DuLNode;
L->prior=NULL;
L->next=NULL;
return 1;
}

int ListEmpty(DuLinkList L){
if(L->next){
return 0;//非空
}else{
return 1;//空
}
}

int ListLength(DuLinkList L){
int length=0;
struct DuLNode *p;
p=L->next;
while(p){
p=p->next;
++length;
}
return length;
}

void TraveList(DuLinkList L){
struct DuLNode *p;
p=L->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
}
//头插法创建单链表 void CreateList(DuLinkList &L,int n){ L=new DuLNode; L->next=NULL; L->prior=NULL; printf("请输入链表元素:\n"); struct DuLNode *p; for(int i=n;i>0;--i){ printf("请输入第%d个元素值:",i); struct DuLNode *s; s=new DuLNode; scanf("%d",&s->data); s->next=L->next; if(L->next!=NULL)//不加这一条if语句就错!! //原因:当链表为空时,即只有一个头结点,则L->next为空,也就不存在后继; //所以,下面的语句不能执行。 L->next->prior=s; L->next=s; s->prior=L; } }
//尾差法创建双向链表
void CreateList1(DuLinkList &L,int n){ L=new DuLNode; L->next=NULL; L->prior=NULL; struct DuLNode *q; q=L; printf("请输入链表元素:\n"); for(int i=0;i<n;i++){ printf("请输入第%d个元素的值:",i+1); struct DuLNode *p; p=new DuLNode; scanf("%d",&p->data); p->prior=q; p->next=NULL; q->next=p; q=p; } }
int main(){
DuLinkList L;

if(InitList(L)){
printf("双向链表初始化成功!\n");
}else{
printf("双向链表初始化失败!\n");
}

if(ListEmpty(L)){
printf("当前链表为空!\n");
}else{
printf("当前链表非空!\n");
}

printf("请输入链表的长度:");
int n;
scanf("%d",&n);
CreateList(L,n);
//CreateList1(L,n);
printf("遍历链表如下:\n");
TraveList(L);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: