c++双向链表的创建 是怎么输出的啊 是先输出前一个 紧接着输出后一个么??

如题所述

这是动态建立链表和链表排序,复制,vc6.0验证过
#include <iostream.h>
struct node
{
int a;
node *next;
};
node *initLink(int size)//初始化节点链表
{
node *p=new node;
p->next = NULL;
cout<<"输入头结点的值:"<<endl;
cin>>p->a;
node *h=p;
for (int i=1; i<size; i++)
{
p->next=new node;
p->next->next = NULL; //这里p->next->next=NULL 了之后
cout<<"输入新节点的值:"<<endl;
cin>>p->next->a;
p=p->next;
}
//p->next=NULL; //就不用在这里加一句p->next=NULL了
return h; //返回头指针
};
void print(node *p)
{
while (p!=NULL)
{
cout<<p->a<<' ';
p=p->next;
}
cout<<endl; //输出节点的值
}
node *sort(node *head)
{
node *head2=NULL; //排序原理为:定义两个指针一个是新建链表的头指针,
//一个是新建链表尾指针,头指针(head2)不移动,另外一个指针(p6)当做尾指针一直往后移,移一下
//增加一个节点,直到最后
// cout<<"新建一个链表的头结点值为1"<<endl;
// head2->a=1;
node *p3=head; //p3保存原来头结点
node *p_min; //p_min始终保存最小指针
node *p4,*p5,*p6;
p6=head2;
while (head!=NULL)
{
p_min=head;
p3=p_min;
while(p3!=NULL)
{
p4=p3; //p4保存p3指针的前驱
p3=p3->next; //p3始终往下走直到找到小于p_min的节点为止
if (p3!=NULL&&p3->a<p_min->a)//这里得加一句p3!= NULL因为虽然while中有p3但是紧接着p3往下走了,要是这时片
{ //为NULL就会报错
p5=p4; //p5保存前驱指针p4,
p_min=p3; //p_min 保存p3
}
}

if (p6==NULL) //如果为新建的第一个节点,让两个指针都指向最小的那个节点,头结点嘛,head2也是要指向它的
{
head2=p_min;
p6=p_min;
}
else
{
p6->next=p_min;//不是的话就让p6指向最小结点p_min
p6=p6->next; //往后移
}

if (p_min==head) //如果最小结点就是原来的头结点,还要
{ //让head=head->next,往后移(去掉该节点)
head=head->next;
p_min=head; //接着从头开始,p_min指向head,p3指向head,再来一遍
p3=p_min;
}
else
{
p5->next=p_min->next;//(去掉该节点)//节省两行代码,10月20号
}
}
p6->next=NULL; //最后让p6->next = NULL;可以使结束程序

return head2;
}
node *copy(node *head)
{
node *p1=head;
node *n_head=new node;//copy函数开始时新建一个节点
node *p2=n_head;
while (p1!=NULL)
{
if (p1==head) // 判断如果为第一个节点,
{
p2->a=p1->a;
p1=p1->next;
}
else
{
p2->next=new node;
p2->next->a=p1->a;
p2=p2->next;
p1=p1->next;
}
}
p2->next=NULL;
return n_head;
}
node *Copy(node *head)
{
node *h=new node,*move,*t=new node;
h=head; //我靠,节点赋值10月21号
move=h; //这是指针指向
t=head->next;
for(t=head->next;t!=NULL;t=t->next )
{
move->next=new node;
move->next->a=t->a;
// move->next->next=NULL;
move=move->next;
}
move->next=NULL;//移到这里的话,效率高点
return h;
}
void main ()
{
node *h1;
node *h2=NULL;
h1=initLink(5);
// print(h1);
// h2=sort(h1);
// print(h2);

node *cpy;
cpy=copy(h1);
print(cpy);
cout<<endl<<endl;
node *d=Copy(h1);
print(d);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-15
你想怎么输出就怎么输出,就是遍历嘛
双向链表只是比单向多了一个指向前一个结点的指针域罢了追问

你给我写一个呗 简单点的 我真是不会啊 谢谢你 谢谢你 谢谢你了 双向是怎么回事啊 ??

追答

呃,写一个?随便找本《数据结构》都有啊。
单向链表你知道吧,可以从前往后遍历的;它的每个结点里边有一个值域,一个指向后方结点的指针域;双向链表就多了一个指向前一个结点的指针域。双向就是可以从后往前找。

输出的时候就是从前往后(双向也可以从后往前)遍历链表,找到你要输出的结点,输出就好了

追问

那就是双向链表 我给出头指针 就可以从前往后找 那我给出尾指针 就是从后往前找 对么??

追答

对,因为它每个结点都可以找到它前一个结点和后一个结点(两个指针域),而单向链表只能找它后边的结点(只有一个指针域)

本回答被网友采纳

用c++语言实现双向链表的排序
}\/\/ 冒泡排序对链表进行排序void BubbleSort(Node *head) {Node *pTemp;int maxIdx, idx;\/\/ 计算链表长度maxIdx = 0;for (pTemp = head; pTemp != NULL; pTemp = pTemp->next)++maxIdx;idx = 0;while (idx < maxIdx-1) {for (pTemp = head; idx < maxIdx-1; pTemp = pTemp->...

c++ 单向链表和双向链表有什么区别?各自有什么优缺点?
1、双向链表:从双向链表中的任意一个结点开始,都可以很方便地访问前驱结点和后继结点。2、单向链表:单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小,结点的访问方便,可以通过循环或者递归的方法访问到任意数据。三、缺点不同 1、双向链表:增加删除节点复杂,需要多分配一个...

...输出它的前驱字符,字符本身,它的后继字符,该怎么设计程序
代码如下,供你参考。第一种用ASCII码,第二种用字符串 include <stdio.h>#include <string.h>int main(void){ char c; printf("Enter a character: "); scanf("%c", &c); printf("%c, %c, %c\\n", c, c-1, c+1); \/\/依次输出原字符,前驱字符,后继字符 ...

C++ 双向链表 插入1,2,3,4,5,6,7,8,9,10到随机任意位置 然后再按1-1...
struct NODE *next; \/\/后继 }LNodeo,*LinkList;\/\/打印双向链表 void PrintfLink(LinkList phead){ if(phead == NULL)printf("双向链表为空!\\n");while(phead !=NULL){ printf("%d ",phead->data);phead=phead->next;} printf("\\n");} \/\/生成双链表 LinkList CreatLink(){ Lin...

在C++中,怎么理解“->”是一个单目运算符,它的操作数时什么,返回值又是...
那我来说说我的理解 ->的左边是变量,而右边只能是成员,由于不指定所属对象的成员本身不能作为函数参数,所以->的运算符重载函数只能被看作接受一个操作数,其返回的是一个指针(也就是说A->B的时候如果A不是指针,则解释为c->B,其中c是对A调用运算符函数->所返回的指针)...

C++怎么确定一个链表是否是空的?
else\/\/如果存在其他的结点,则循环连接在q后面,q是指向链表中最后一个结点。q->next = p;q = p;printf("请输入结点号[-1]退出:");scanf("%d", &Mc.M_num);if (Mc.M_num < 0) break;printf("请输入名字:");scanf("%s", Mc.M_name);printf("请输入股票:");scanf("%d", &...

一个C++程序是由哪几个部分构成的?其中的每一部分起什么作用?
而printf(),puts()这两个函数都可以工作于显示用来编写初级界面挺好!!所以一般也可将C语言化成MVC模式(M指业务逻辑层,业务代码,V指界面层,编写界面,C控制代码,例如main(),也可让main()调用一个控制个函数调用的函数)!!!只要你对高级C部分有所了解!!一样完成java等面向对象语言的...

C++怎么确定一个链表是否是空的?
1 带头节点。对于带头节点的链表,存在有不变的头结点head,这个节点并不保存任何数据,仅提供链表起始的一个标识。对于此类链表,判断为空的条件为head->next==NULL。当head的next值为NULL,这时链表为空。2 不带头结点。不带头结点的情况,链表的起始节点是可能变化的,但无论如何变化,必须有一个...

c语言中的merge函数
在main()函数中,我们创建两个容器,一个数组`ai1`和一个双向链表`lsti1`,并按照降序填充:创建两个数组和链表,并从大到小填充:array ai1 = {1, 3, 4, 5};list lsti1;for (const auto &i : ai1)lsti1.push_front(i);同样的步骤应用于`ai2`和`lsti2`。然后,我们调用`merge()...

双向链表排序c语言程序设计
DLinkList CreateList(int n) { \/\/ 创建双向环形链表 DLinkList p,q,head; head = p = (DLinkList)malloc(sizeof(node)); head->sn = 0; head->data = 0; for(int i = 0;i < n;i++) { p->next = (DLinkList)malloc(sizeof(node)); if(p->next== NULL) { printf("申请动态内存...

相似回答