⑴ 怎么用指针数组存储链表节点的地址
typedef struct tagDbNode
{
int num;
struct tagDbNode * next;
} DbNode, * pdbNode,**lpdbNode;
//创建结点
pdbNode CreateNode(int num)
{
pdbNode pnode = (pdbNode)malloc(sizeof(DbNode));
pnode->num = num;
pnode->next = pnode;
return pnode;
}
lpdbNode就是指向指针的指针,lpdbNode=new pdbNode(N);
⑵ 用数组实现链表的存储池管理
理论上绝对是可以的。不过要加上新的属性可能增加存储空间(如多维数组,或者像JAVA那样的类数组)。
就像树可以线索化(而且有多种线索化都是用链表实现的),也可以按层输出这个可以看成数组,但是为了进行确定可能需要额外的空间来实现你的结构要求,而且会影响你的操作和索引速度。
图也是可以线索化的。
但是还有集合这种弱关系的数据结构可能没有指针就不推荐使用链表。当然指针可以设置为NULL但是数组还是可以的。
有的时候不是不可以用,只是用的话代价比较大,不是最优的方法。数据结构主要是让你设计空间和时间复杂度最低(即最优算法)所以教你的都是针对抽象的问题,最好的结构和算法。
⑶ 存储多个链表头指针的指针数组该怎么样做
typedef struct Node
{
int b;
char a[12];
struct Node *next;
}LinkNode;
对这样一个结构
你可以 这样定义一个chain数组来存放LinkNode指针
LinkNode (*chain)[10];
chain[0]指向第一个LinkNode结构(当然 指向的是头结点)
chain[1]指向第一个LinkNode结构
依次类推
⑷ 如何用指针表示链表某个结点的前一个结点
你想想就知道啦,单链表里边就有两个域,一个指向下一个节点的指针,一个存放该节点的值,仅靠单链表本身是实现不了的,你要着某个节点的前一个节点除非另外定义一个函数,找到一个节点如果它的后继节点是你的目标节点那么这个该节点自然就是它的前驱节点啦。不知道你为什么一定要用单链表,如果可以用双向链表的话最好还是双向链表啦,如果还有什么问题接着提就是啦,能解决的一定知无不言
⑸ C中用指针动态建立单链表的几种方法
通常用数组可以实现线性表的顺序存储,但是,数组事先要定义固定的长度,并且所分配的存储空间是连续的。这样一来,就不能达到真正意义上的动态分配存储空间以及充分利用存储空间的目的;另外,用数组不利于实现线性表中结点的动态增加与删除。而用链表则可以弥补以上不足。本文主要以建立学生信息链表为例,分别介绍无头结点、有头结点单链表的逆序建立和顺序建立过程以及算法实现。
⑹ 实现链表(C语言)
链表应该没有很高效的查找算法吧,只有一个一个按顺序查找啊
不过可以设置两个指针变量,
link* p1,p2;
p1用来遍历
p2用来记录与p2相差K-1个节点
当p1遍历到完链表时,p2就是了
⑺ 关于用指针数组存储链表节点的问题
id[1]这个代表结构体;
id[1].next ;这个是结构体指针;
相当于是a[1]=a[1].next;他们两个是不能互相赋值的。
a[1]=*a[1].next;应该是可以的,这不是把next的地址给a,要想赋给a,a[1].next=a[2].next;同类的才可以赋值。
*(id+1)=*(id+1)->next ;
这个是指针,*代表指向的内容。
*(id+1)代表a[1],*(id+1)->next代表a[i+1].next指向的内容,等于是a[i+1]=a[i+1]next指向的结构体。
结构体的头地址是用&来取的,比如struct st{int id;
struct st *next)}a[1];
&a[0]是第一个结构体的首地址,以此类推。
⑻ 怎么把结构体数组的数据存入链表中 谢谢
链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t *next;除了这个指针,list_t 中可以包含其它类型的数据,包括结构体变量。比如:typedef struct {
struct usr_struct data;
list_t *next;
} list_t;
⑼ 存储链表头指针的指针数组做形参
total应该是传进去了,但是到底total里面的内容是不是五个链表的头指针,得看你read_file的实现是不是成功,建议在read_file 和 cir 之间将 total的链表指针进行打印,同时也在read_file内对每个存储进total的头指针进行打印,比较两类地址是不是相同。
⑽ 链表中的怎么使用指针进行链表的建立、插入、删除等处理操作
1、链表建立需要节点。这是存储数据的基础,以C++语言为例,要建立这样的节点(假设存储信息的类型作为一个模板)
template <class DataType>
struct Node{
DataType info; //节点存储的信息
Node<DataType> *next;
};
2、因为你是使用指针,那么,就需要动态创建结构体。使用new 运算符在堆内存中创建
Node<DataType> *head = new Node<DataType>;
堆内存和栈不同,你动态申请和释放都是在堆内存里,所以你不用担心调用一个函数,在
这个函数里动态申请了内存,返回之后没有了,在的。
3、插入节点
我们以插入头结点后边为例:
假设函数原型为:
void AddToFirst( Node<DataType> * head, DataType data );
那么函数主体中这样写:
{
Node<DataType> * ptr = new Node<DataType>; //动态生成一个新的节点
ptr->info = data; //存储传递过来的DataType类型的数据
ptr->next = head->next; //先让ptr指向的地方为head指向的地方
head->next = ptr; //再让头结点指向ptr
}
这样,添加到头结点之后的动作就完成了。
4、删除操作
删除操作需要查找是否存在要删除的数据,存在则删除,不存在不采取动作
函数原型:
void DeleteNode ( Node<DataType> *head, DataType data );
我们设置ptr作为遍历链表的游标,设置ptrNext指针作为ptr的下一个节点,将它里面的info与data对比;
设置两个指针是为了方便我们删除节点。
函数定义如下
{
Node<DataType> *ptr = head;
Node<DataType> *ptrNext = prt->next;
while( ptrNext && ptrNext->info != data ){ //当ptrNext不是NULL且包含的数据不等于data时
ptr = ptrNext;
ptrNext = ptrNext->next; //ptr和ptrNext均往下移动一次
}
if( ! ptrNext ) //如果ptrNext == NULL
cout << "链表中不存在此数据:" << data << endl;
else{ //那么跳出循环的情况就只能是ptrNext->info == data啦,此处删除ptrNext;
ptr->next = ptrNext->next; //释放ptrNext指向的堆内存之前,要把
//ptrNext之前的节点,也就是ptr,将其指向prtNext指向的地方
delete ptrNext; //释放堆内存
cout << "删除成功!" << endl;
}
}
关于链表的建立、添加节点、删除节点,还需要你自己多多琢磨。