c++链表问题
dnode<int>*intList=newdnode<int>,*newNode,*curr;newNode=newdnode<int>(5);newNode->nex...
dnode<int> *intList=new dnode<int>, *newNode, *curr;
newNode=new dnode<int>(5);
newNode->next=intList->next;
intList->next->prev=newNode;
newNode->prev=intList;
intList->next=newNode;
注dnode类是含有2个指针(*next *prev)的类.
请问 newNode->next=intList->next;
intList->next->prev=newNode;
这两句话是什么意思 展开
newNode=new dnode<int>(5);
newNode->next=intList->next;
intList->next->prev=newNode;
newNode->prev=intList;
intList->next=newNode;
注dnode类是含有2个指针(*next *prev)的类.
请问 newNode->next=intList->next;
intList->next->prev=newNode;
这两句话是什么意思 展开
5个回答
2009-11-25
展开全部
单链表的c语言实现(1)
一、单链表的建立
有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。
链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。
所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef struct node
{
char name[20];
struct node *link;
}stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
return(h);
}
main()
{
int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/
}
这样就写好了一个可以建立包含N个人姓名的单链表了。
写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
一、单链表的建立
有了动态内存分配的基础,要实现链表就不难了。
所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。
链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。
所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:
1、数据域:用来存储本身数据
2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。
例:
typedef struct node
{
char name[20];
struct node *link;
}stud;
这样就定义了一个单链表的结构,其中char name[20]是一个用来存储姓名的字符型数组,指针*link是一个用来存储其直接后继的指针。
定义好了链表的结构之后,只要在程序运行的时候爱数据域中存储适当的数据,如有后继结点,则把链域指向其直接后继,若没有,则置为NULL。
下面就来看一个建立带表头(若未说明,以下所指链表均带表头)的单链表的完整程序。
#include <stdio.h>
#include <malloc.h> /*包含动态内存分配函数的头文件*/
#define N 10 /*N为人数*/
typedef struct node
{
char name[20];
struct node *link;
}stud;
stud * creat(int n) /*建立单链表的函数,形参n为人数*/
{
stud *p,*h,*s; /* *h保存表头结点的指针,*p指向当前结点的前一个结点,*s指向当前结点*/
int i; /*计数器*/
if((h=(stud *)malloc(sizeof(stud)))==NULL) /*分配空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
h->name[0]='\0'; /*把表头结点的数据域置空*/
h->link=NULL; /*把表头结点的链域置空*/
p=h; /*p指向表头结点*/
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL) /*分配新存储空间并检测*/
{
printf("不能分配内存空间!");
exit(0);
}
p->link=s; /*把s的地址赋给p所指向的结点的链域,这样就把p和s所指向的结点连接起来了*/
printf("请输入第%d个人的姓名",i+1);
scanf("%s",s->name); /*在当前结点s的数据域中存储姓名*/
s->link=NULL;
p=s;
}
return(h);
}
main()
{
int number; /*保存人数的变量*/
stud *head; /*head是保存单链表的表头结点地址的指针*/
number=N;
head=creat(number); /*把所新建的单链表表头地址赋给head*/
}
这样就写好了一个可以建立包含N个人姓名的单链表了。
写动态内存分配的程序应注意,请尽量对分配是否成功进行检测。
展开全部
按照右值赋值给左值的道理,很容易理解:
newNode->next=intList->next;-----把intList的下一个node给newNode的next,即有,newNode->next等于intList->next;
intList->next->prev=newNode;这个呢,就是把newNode给intList->Next。。
所以有:
原来:intList-->--指向-->--X-->--->---
后来有:
intLIst-->--指向-->--newNode-->--指向-->X-->-->--
newNode->next=intList->next;-----把intList的下一个node给newNode的next,即有,newNode->next等于intList->next;
intList->next->prev=newNode;这个呢,就是把newNode给intList->Next。。
所以有:
原来:intList-->--指向-->--X-->--->---
后来有:
intLIst-->--指向-->--newNode-->--指向-->X-->-->--
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我帮你做
了一些更改,改的地方我都注明了
#include
<iostream>
#define
N
10
using
namespace
std;
typedef
int
TypeDate;
typedef
struct
Node{
TypeDate
key;
struct
Node
*next;
}ListNode;
typedef
ListNode
*List;
void
CreatListNode(List
*head,int
n)//用指向指针的指针才能传回头结点的地址
{
List
q=new
ListNode;
q->next=NULL;//指针开始时一定要初始化为空
*head=q;
for(int
i=1;i<=N;i++)
{
List
p=new
ListNode;
p->next=q->next;
p->key=i;
q->next=p;
}
}
void
PrintList(List
head)
{
for(int
i=1;i<=N;i++)
{
cout<<head->next->key<<"
";//从头结点的下一个结点开始输出;
head=head->next;
}
}
void
main()
{
List
head;
CreatListNode(&head,N);
PrintList(head);
}
了一些更改,改的地方我都注明了
#include
<iostream>
#define
N
10
using
namespace
std;
typedef
int
TypeDate;
typedef
struct
Node{
TypeDate
key;
struct
Node
*next;
}ListNode;
typedef
ListNode
*List;
void
CreatListNode(List
*head,int
n)//用指向指针的指针才能传回头结点的地址
{
List
q=new
ListNode;
q->next=NULL;//指针开始时一定要初始化为空
*head=q;
for(int
i=1;i<=N;i++)
{
List
p=new
ListNode;
p->next=q->next;
p->key=i;
q->next=p;
}
}
void
PrintList(List
head)
{
for(int
i=1;i<=N;i++)
{
cout<<head->next->key<<"
";//从头结点的下一个结点开始输出;
head=head->next;
}
}
void
main()
{
List
head;
CreatListNode(&head,N);
PrintList(head);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a的下一个等于b的下一个
a的下一个地前一个等于b, 就是a等于b
------
这两句话是在复制, 呵呵
a的下一个地前一个等于b, 就是a等于b
------
这两句话是在复制, 呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用newNode来完全替代intList的位置
估计下一步是要用intList进行某些其他操作了吧?
估计下一步是要用intList进行某些其他操作了吧?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询