鏈表是一種常見的基礎數據結構,結構體指針在這裏得到了充分的利用。鏈表可以動態的進行存儲分配,也就是說,鏈表是一個功能極爲強大的數組,他可以在節點中定義多種數據類型,還可以根據需要隨意增添,刪除,插入節點。鏈表都有一個頭指針,一般以head來表示,存放的是一個地址。鏈表中的節點分爲兩類,頭結點和一般節點,頭結點是沒有數據域的。鏈表中每個節點都分爲兩部分,一個數據域,一個是指針域。說到這裏你應該就明白了,鏈表就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱爲“表尾”,它的地址部分放一個“NULL”(表示“空地址”),鏈表到此結束。
#include<iostream>
using namespace std;
typedef struct Node{
int data;
struct Node* pNext;
}NODE,*PNODE;
//創建鏈表函數
PNODE create_list(int len) {
PNODE phead = new NODE;
if (phead == NULL) {
exit(-1);
}
PNODE ptail = phead;
ptail->pNext = NULL;
cout << "請輸入存儲數據:" << endl;
for (int i = 0; i < len; i++) {
int a;
cin >> a;
PNODE pnew = new NODE;
if (NULL == pnew) {
exit(-1);
}
pnew->data = a;
ptail->pNext = pnew;
pnew->pNext = NULL;
ptail = pnew;
}
return phead;
}
//求鏈表的長度函數
int length_list(PNODE phead) {
PNODE p = phead->pNext;
int len = 0;
while (p != NULL) {
p = p->pNext;
len++;
}
return len;
}
//遍歷鏈表函數
void traverse_list(PNODE phead) {
PNODE p = phead->pNext;
while (p != NULL) {
cout << p->data<<" ";
p = p->pNext;
}
cout << endl;
}
//鏈表排序函數
void sort_list(PNODE phead) {
int len = length_list(phead);
PNODE p,q;
int i, j;
for (p= phead->pNext, i = 0, p; i < len - 1; i++, p=p->pNext) {
for (j = 0, q = p->pNext; j < len - i - 1; q = q->pNext, j++) {
if (p->data > q->data) {
int temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
cout << endl;
}
//鏈表中插入數據函數
bool insert_list(PNODE phead, int pos, int val) {
PNODE p = phead;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->pNext;
i++;
}
if (p == NULL) {
return false;
}
PNODE pnew = new NODE;
if (pnew == NULL) {
cout << "動態內存分配失敗" << endl;
exit(-1);
}
pnew->data = val;
PNODE q = p->pNext;
p->pNext=pnew;
pnew->pNext = q;
return true;
}
//鏈表中刪除數據函數
bool delete_list(PNODE phead, int pos, int *val) {
PNODE p = phead;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->pNext;
i++;
}
if (p == NULL) {
return false;
}
PNODE q = p->pNext;
*val = q->data;
p->pNext = q->pNext;
delete q;
return true;
}
int main() {
int len;
cout << "輸入構建鏈表的長度;" << endl;
cin >> len;
PNODE p = create_list(len);
cout << "您構建的鏈表爲:"<< endl;
traverse_list(p);
int l = length_list(p);
//cout << "您構建的鏈表長度爲:" <<l<< endl;
sort_list(p);
cout << "排序後的鏈表爲:" << endl;
traverse_list(p);
insert_list(p, 5, 0);
cout << "在第五個位置插入數據0後的鏈表爲:" << endl;
traverse_list(p);
int val;
delete_list(p, 2, &val);
cout << "刪除第二個位置的數據後的鏈表爲:" << endl;
cout << "刪除第二個位置的數據爲:" << val<<endl;
traverse_list(p);
sort_list(p);
cout << "重新對該鏈表進行排序得到鏈表爲:" << endl;
traverse_list(p);
return 0;
}