c或者c++實現下面的題目並測試:
1. 比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?
2. 從尾到頭列印單鏈表
3. 刪除乙個無頭單鏈表的非尾節點
4. 在無頭單鏈表的乙個節點前插入乙個節點
5. 單鏈表實現約瑟夫環
6. 逆置/反轉單鏈表
7. 單鏈表排序(氣泡排序&快速排序)
8. 合併兩個有序鍊錶,合併後依然有序
9. 查詢單鏈表的中間節點,要求只能遍歷一次鍊錶
10. 查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶
長度固定,必須在分配記憶體之前確定陣列的長度。
儲存空間連續,即允許元素的隨機訪問。
儲存密度大,記憶體中儲存的全部是資料元素。
要訪問特定元素,可以使用索引訪問,時間複雜度為 o(1)o(1)。
要想在順序表中插入或刪除乙個元素,都涉及到之後所有元素的移動,因此時間複雜度為 o(n)o(n)。
順序表最主要的問題就是要求長度是固定的,可以使用倍增-複製的辦法來支援動態擴容,將順序表變成「可變長度」的。
具體做法是初始情況使用乙個初始容量(可以指定)的陣列,當元素個數超過陣列的長度時,就重新申請乙個長度為原先二倍的陣列,並將舊的資料複製過去,這樣就可以有新的空間來存放元素了。這樣,列表看起來就是可變長度的。
二、鍊錶
鍊錶,類似它的名字,表中的每個節點都儲存有指向下乙個節點的指標,所有節點串成一條鏈。根據指標的不同,還有單鏈表、雙鏈表和迴圈鍊錶的區分,如圖 2 所示。
單鏈表是只包含指向下乙個節點的指標,只能單向遍歷。
雙鏈錶即包含指向下乙個節點的指標,也包含指向前乙個節點的指標,因此可以雙向遍歷。
迴圈單鏈表則是將尾節點與首節點鏈結起來,形成了乙個環狀結構,在某些情況下會非常有用。
還有迴圈雙鏈表,與迴圈單鏈表類似,這裡就不再贅述。
由於鍊錶是使用指標將節點連起來,因此無需使用連續的空間,它具有以下特點:
長度不固定,可以任意增刪。
儲存空間不連續,資料元素之間使用指標相連,每個資料元素只能訪問周圍的乙個元素(根據單鏈表還是雙鏈表有所不同)。
儲存密度小,因為每個資料元素,都需要額外儲存乙個指向下一元素的指標(雙鏈表則需要兩個指標)。
要訪問特定元素,只能從煉表頭開始,遍歷到該元素,時間複雜度為 o(n)o(n)。
在特定的資料元素之後插入或刪除元素,不涉及到其他元素的移動,因此時間複雜度為 o(1)o(1)。雙鏈表還允許在特定的資料元素之前插入或刪除元素
用棧模擬輸出
#include
#include
#include
using
namespace
std;
// 除錯開關
#define __tmain main
#ifdef __tmain
#define dout cout
#else
#define dout 0 && cout
#endif // __tmain
#ifdef __tmain
struct listnode
*/};
#endif // __tmain
/*** struct listnode
* };
*/class solution
// 為了效率我們靜態vector開闢空間
vector
res(count);
dout <<"count = "
return res;
}};int __tmain( )
void printlistformtailtohead(pnode phead)
else
} void deletenottailnode(pnode pos)//刪除乙個無頭單鏈表的非尾節點
pnode buy_node(datatype data)//建立節點!!!
tmp->
data
=data;
tmp->pnext =
null;
return tmp;
}void insertnotheadnode(pnode pos, datatype data)
#include
#include
#include
typedef struct stu
node,*linklist;
void kong(linklist &l)
void creat(linklist &l,int n)
r->next=null;
}void huan(linklist &l,int n,int
m) else
else
}p=l->next;
for(j=1;j<=n;j++)
p=l->next;
g=l->next;
x=f=1;
p1=l;
}else
}}void main()
typedef
int datatype;
typedef
struct strnode
node;
typedef
struct strnode* pnode;
pnode reversenode(pnode phead)// 逆置 / 反轉單鏈表
pcurrent = phead;
while (pcurrent != null)
if (pcurrent == null) // 注意把最後乙個節點別忘了反轉!!
}
void bubblesort(int a, int n)
} }
}void print(int a, int n)
cout
int partition(int a, int low, int high)
print(a,10);
return low;
} void qsort_improve(int r[ ],int low,int high, int k)
}
void quicksort(int r, int n, int k)
r[j+1] = tmp;
}
}
int main();
cout
<<"初始值:";
print(a,10);
quicksort(a,9,4);
cout
<<"結果:";
print(a,10);
}
"font-family:microsoft yahei;"
>
void bubble_pnode(pnode phead)
p1 = phead;
while (p1 !=
null)
p2 = p2->pnext;
} p1 = p1->pnext;
} }
"font-family:microsoft yahei;"
>pnode merge_node(pnode phead1, pnode phead2)//合併兩個有序鍊錶
ph1->pnext = ph2;
pphead = phead1;
bubble_pnode(pphead);
return pphead;
}
slistnode * findmidnode(slistnode * phead)
else
slow = slow->next;
} return slow;
} 也可以這樣寫,更為簡潔
while (fast&&fast->next )
#include
#include
using
namespace
std;
typedef
struct listnode listnode,*node;
int main()
node p=head;
node q=head;
int i=1;
while(p!=null)
else
}cout
<<"the data is: "
}
SAM複習題表
今天重新學了一下sam 那麼一些題目肯定是少不了的 在這裡記錄一下吧,可能沒什麼啟發的題就不寫了 題意 多個串的最長公共子串 題解 對於乙個建立sam,然後對於剩下的所有點在上面跑,對於每乙個點的狀態取最小值。但是這樣是不夠的,你還要跳一次fail來進行更新,這個的話拓撲更新就可以了 題意 求第k大...
鍊錶課後複習題 王道
目錄 1.設計乙個遞迴演算法,刪除不帶頭結點的單鏈表l中所有值為x的結點。2.刪除帶頭結點的單鏈表l中所有值為x的結點。3.在帶頭結點的單鏈表l中從尾到頭反向輸出每個結點的值 4.帶頭結點單鏈表l中刪除乙個最小值結點的比較高效的演算法,假設最小值結點唯一 5.將帶頭結點的鍊錶就地逆置 明日繼續更 以...
檔案複習題
1.把乙個數字的list從小到大排序,然後寫入檔案,然後從檔案中讀取出來檔案內容,然後反序,在追加到檔案的下一行中 首先 將list 排序,其次寫入檔案 l 10,8 3,2 6,0 1,9 5,4 l1 sorted l f codecs.open 2.txt wb f.write str l1 ...