⑴ 演算法中的鏈表到底是什麼,用處在哪裡
鏈表由多個結點連接而成,一個結點分為數據域和指針域,數據域存儲數據,指針域存儲下一個結點的內存地址。鏈表結點的內存地址可以不連續,可以充分利用內存空間,代價是查找慢,必須從頭結點開始查找。
⑵ 什麼是單鏈表,儲存上有哪些特點
單鏈表是一種鏈式存取的數據結構,用一組地址任意的存儲單元存放線性表中的數據元素。
祝好運,望採納
⑶ 順序鏈表到底是什麼,在哪裡講的
順序鏈表
順序鏈表其實就是一個動態的數組而已。在該鏈表的結構體中包含鏈表的基地址和鏈表當前的長度和鏈表當前已分配的存儲容量。
注意:順序鏈表不和單鏈表和雙鏈表一樣,它並不是每個元素都包含在一個結點裡面。它是類似於數組,有一個類似數組名的基地址和一個表示鏈表當前長度的變數以及一個表示當前已分配容量的變數。並且這些均屬於整個鏈表。並不屬於某個元素。
#include <iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREAMENT 10
typedef bool Status;
#define OK true
#define ERROR false
//定義一個鏈表結點
typedef struct
{
int *elem; //基地址指針,可以理解為就是一個動態數組的名字而已
int length;//當前長度
int listsize;//當前分配的存儲容量
}SqList;
//初始化鏈表函數
Status InitList(SqList &L)
{
L.elem = (int *)malloc(LIST_INIT_SIZE*sizeof(int));
if (!L.elem)
{
cout << "Error!" << endl;
exit(0);
}
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
Status ListInsert(SqList &L,int i,int e)
{
if (i<1 || i>L.length+1)
return ERROR;
if (L.length >= L.listsize)
{
int *newbase = (int *)realloc(L.elem,(L.listsize + LISTINCREAMENT)*sizeof(int));
if (!newbase)
{
cout << "Error!" << endl;
exit(0);
}
L.listsize += LISTINCREAMENT;
L.elem = newbase;
}
int *q = &(L.elem[i-1]);//獲得i元素的指針
for (int *p = &(L.elem[L.length - 1]);p >= q; --p)
{
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
Status ListDelete(SqList &L,int i,int &e)
{
int *p = &(L.elem[i]);
e = *p;
int *q = &(L.elem[L.length]);
for (; p != q; ++p)
{
*(p - 1) = *p;
}
--L.length;
return OK;
}
int main()
{
SqList q;
InitList(q);
for (int i = 0;i < 10; i++)
{
cin >> q.elem[i];
q.length++;
}
for (i = 0;i < q.length; i++)
{
cout << q.elem[i] << " ";
}
cout << endl;
ListInsert(q,5,6);
for (int *p = q.elem;p != &(q.elem[q.length]);++p)
{
cout << *p << " ";
}
cout << endl;
int e;
ListDelete(q,5,e);
for (p = q.elem;p != &(q.elem[q.length]);++p)
{
cout << *p << " ";
}
return 0;
}
⑷ C語言中鏈表的存儲、讀取、修改問題
1、鏈表存到文件中去後,再取出來是不是要再次對各個元素進行鏈表的關聯(就是下一個元素地址賦予前一個元素中的地址變數中)?有沒有更簡單的方法讓其自動恢復原先的鏈表關系?
答:鏈表的關系的卻需要重新建立,沒有別的方法,這里只需要重新設置,因為鏈表是存儲在內存中的,每次malloc出來的指針地址不一致,無法存儲到文件中,下次繼續使用。
2、編輯前,是否需要將整個文件流從文件中都讀取至堆里去,連立成一個鏈表?如果文件很大,大過內存怎麼辦?
答:文件中存儲的是整個鏈表的信息,你只需要每次讀出一個struct就可以了。這個malloc出來的struct中你需要讀取一個index的值,然後以這個index的值再建立一個鏈表,將原來那個malloc出來的struct可以釋放,這樣就可以不用擔心文件很大,怕內存不足的情況。因為即使你的鏈表再長,一個int值足以表示。如果怕int(4位元組)不夠,可以用double類型,甚至可以用鏈表嵌套。
3、如果整個文件都讀出至堆中,並關聯成了鏈表,那麼修改後用fwrite()再次保存至文件中時,是不是把原來的記錄都覆蓋了還是在後面追求啊?
答:這里寫文件就看你自己是怎麼打開文件了。(存儲的時候是不是按照struct大小存儲還是按照實際數據大小存儲)最好的方式是可以隨便修改,這種方式最難,因為要考慮到更改的是第幾個位元組。最簡單的方式,直接將文件刪除,重新建立,但是這樣就必須要將所有數據讀取到內存中。
如果你要實現問題2中的方法,則問題3即要做大量的修改。
⑸ 鏈表在內存中的存儲方式到底是怎樣的數據域跟指針域的類型又分別是什麼
鏈式存儲表示的特點是用一組任意的存儲單元存儲線性表的數據元素(這組存儲單元可以是連續的,也可以是不連續的)。因此,為了表示每個數據元素 與其直接後繼數據元素 之間的邏輯關系,對數據元素 來說,除了存儲其本身的信息之外(各種數據類型),還需存儲一個指示其直接後繼的信息(即直接後繼的存儲位置)(指針類型)。由這兩部分信息組成一個"結點",表示線性表中一個數據元素