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

来源:互联网 发布:auto.js 编辑:程序博客网 时间:2024/06/05 14:19

双向链表的创建

双向链表的创建同样像单链表一样可以有两种方法:头插法和尾插法。

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

算法思想:

先定义一个指针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);} 


0 0
原创粉丝点击