代碼中主要實現了下面四個操作:
下面幾種操作都是線性操作,算法復雜度都是O(n);
- 鏈表插入默認是按關鍵字大小插入鏈表的,所以最后得到的結果是從大到小排好序的,分三種情況(1)鏈表為空(2)插入的點最小,插在鏈表最前面;(3)插入鏈表中間;(4)插入鏈表結尾。
- 鏈表刪除是在鏈表中找到要刪除的關鍵字,然后刪除該節點,如果有兩個以上,只刪一個。如果沒有就返回。刪除操作必須釋放刪除結點所申請的內存:
- 查找最大理論上就是最后一個,查找最小理論上就是第一個結點。但是我為了通用性寫成了遍歷整個鏈表查找最大和最小的結點。(如果找最小直接返回第一個節點算法復雜度為O(1))
- 打印鏈表,從頭到尾打印鏈表。
主函數中我一函數運行時間為種子生成了一個隨機數組,然后一個一個插入鏈表。
1 #include<iostream> 2 #include<time.h> 3 using namespace std; 4 #define N 100 5 struct list{ 6 int val; 7 list* next; 8 }; 9 list *temp=NULL,*head=NULL; 10 int insertlist(int data){ 11 temp=new list;//臨時結點保存要插入的值, 12 //每次重新申請空間,因為在外面定義,全局變量 13 //所以不用擔心申請的空間在函數結束時被系統銷毀 14 temp->val=data; 15 if(head==NULL){//如果鏈表中沒有值的時候 16 temp->next=NULL; 17 head=temp; 18 return 0; 19 } 20 list* node=new list;//記錄用來與插入值對比的下一個節點, 21 //必須新申請空間,因為指向地址不停在變, 22 //不申請的話頭指針所指向地址也跟着變 23 //局部變量,函數返回時自動銷毀所申請內存 24 list* nodelast;//記錄node上一個節點,可以不用申請新內存 25 node=head; 26 while(node){ 27 if(data<head->val){//如果插入第一個 28 temp->next=head;//把當前頭節點的地址賦給臨時變量的下一個 29 head=temp;//把頭指針換為新結點 30 return 0; 31 } 32 else if(data<node->val){//如果在中間插入 33 temp->next=node; 34 nodelast->next=temp;//node上一個節點指向新插入的節點 35 return 0; 36 } 37 else{ 38 nodelast=node; 39 node=node->next; 40 } 41 } 42 temp->next=NULL;//在最后插入 43 nodelast->next=temp; 44 return 0; 45 } 46 int deletelist(int data) 47 { 48 if(head==NULL) 49 { 50 cout<<"鏈表為空"<<endl; 51 return 0; 52 } 53 if(head->val==data) 54 { 55 list *t=NULL; 56 t=head; 57 head=head->next; 58 delete t; 59 return 0; 60 } 61 temp=new list; 62 temp=head; 63 while(temp->next) 64 { 65 if(temp->next->val==data) 66 { 67 list *t=NULL; 68 t=temp->next; 69 temp->next=temp->next->next; 70 delete t; 71 return 0; 72 } 73 temp=temp->next; 74 } 75 cout<<"鏈表中沒有"<<data<<endl; 76 return 0; 77 } 78 int findmax() 79 { 80 int max=0; 81 if(head==NULL) 82 { 83 cout<<"鏈表為空"<<endl; 84 return 0; 85 } 86 temp=new list; 87 temp=head; 88 while(temp) 89 { 90 if(temp->val>max){ 91 max=temp->val; 92 } 93 temp=temp->next; 94 } 95 return max; 96 } 97 int findmin() 98 { 99 int min=65565; 100 if(head==NULL) 101 { 102 cout<<"鏈表為空"<<endl; 103 return 0; 104 } 105 temp=new list; 106 temp=head; 107 while(temp) 108 { 109 if(temp->val<min){ 110 min=temp->val; 111 } 112 temp=temp->next; 113 } 114 return min; 115 } 116 int printlist() 117 { 118 list* node=new list;//子 119 node=head; 120 while(node){ 121 cout<<node->val; 122 if(node->next) 123 cout<<"->"; 124 node=node->next; 125 } 126 cout<<endl; 127 return 0; 128 } 129 int main() 130 { 131 int number[N],j,t; 132 for(int i=0;i<N;i++) 133 number[i]=i; 134 srand((unsigned)time(NULL)); 135 for(int i=0;i<N;i++)//隨機生成1到N的數組 136 { 137 j=rand()%N; 138 t=number[i]; 139 number[i]=number[j]; 140 number[j]=t; 141 } 142 cout<<"插入前:"; 143 for(int i=0;i<N;i++) 144 { 145 cout<<number[i]; 146 if(i<N) 147 cout<<"->"; 148 } 149 cout<<endl<<endl<<"插入后:"; 150 for(int i=0;i<N;i++) 151 { 152 insertlist(number[i]); 153 } 154 deletelist(99); 155 deletelist(0); 156 printlist(); 157 cout<<endl<<endl<<"鏈表中最大值為:"<<findmax()<<endl; 158 cout<<endl<<endl<<"鏈表中最小值為:"<<findmin()<<endl; 159 return 0; 160 }