對單鏈表的一些操作(待補充)
阿新 • • 發佈:2019-03-21
改變 let 反轉 clas 循環 nbsp () data pri
所有的數據和結點的定義都用簡單的數據類型而不是用模板,重在解決問題的思想和寫代碼能力。
結點定義如下:
1 struct Node
2 {
3 int data;
4 struct Node * next;
5 };
鏈表類定義
class LinkList
{
public:
LinkList();
LinkList(int a[], int n);
~LinkList();
void Insert(int i, int x);
int Delete(int i);
void PrintList();
//就地逆置一個鏈表(反轉)
void reverse();
//循環逆置一個鏈表;
void Reverse();
private:
Node * first;
};
頭插法建立鏈表:
1 LinkList::LinkList(int a[], int n)
2 {
3 first = new Node;
4 first->next = nullptr;
5 for (int i = 0; i < n; i++) {
6 auto s = new Node;
7 s->data = a[i];
8 s->next = first->next;
9 first->next = s;
10
11 }
12 }
尾插法建立鏈表:
1 LinkList::LinkList(int a[], int n) {
2 first = new Node;
3 auto p = first; //你不能試圖改變頭指針指向頭結點
4 for (int i = 0; i < n; i++) {
5 auto s = new Node;
6 s->data = a[i];
7 p->next = s;
8 p = s;
9 }
10 p->next = nullptr;
11 }
在第i個位置插入值為的X結點:
void LinkList::Insert(int i, int x)
{
int cnt = 0;
auto p = first;
while (p->next&&cnt<i-1)
{
p = p->next;
cnt++;
}
if (p == nullptr) throw "locate";
else {
auto s = new Node;
s->data = x;
s->next = p->next;
p->next = s;
}
}
刪除第i個位置的結點:
1 int LinkList::Delete(int i)
2 {
3 int cnt = 0;
4 auto p = first;
5 while (p->next&&cnt<i-1)
6 {
7 p = p->next;
8 cnt++;
9 }
10 if (p == nullptr) throw "locate";
11 else {
12 auto q = p->next;
13 int x = p->next->data;
14 p->next = q->next;
15 delete q;
16 return x;
17 }
18 return 0;
19 }
對單鏈表的一些操作(待補充)