⑴ 怎麼用指針數組存儲鏈表節點的地址
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;
}
}
關於鏈表的建立、添加節點、刪除節點,還需要你自己多多琢磨。