鏈表及其各種函數操作的實現方法


代碼中主要實現了下面四個操作:

下面幾種操作都是線性操作,算法復雜度都是O(n);

  1. 鏈表插入默認是按關鍵字大小插入鏈表的,所以最后得到的結果是從大到小排好序的,分三種情況(1)鏈表為空(2)插入的點最小,插在鏈表最前面;(3)插入鏈表中間;(4)插入鏈表結尾。
  2. 鏈表刪除是在鏈表中找到要刪除的關鍵字,然后刪除該節點,如果有兩個以上,只刪一個。如果沒有就返回。刪除操作必須釋放刪除結點所申請的內存:
  3. 查找最大理論上就是最后一個,查找最小理論上就是第一個結點。但是我為了通用性寫成了遍歷整個鏈表查找最大和最小的結點。(如果找最小直接返回第一個節點算法復雜度為O(1))
  4. 打印鏈表,從頭到尾打印鏈表。

 

主函數中我一函數運行時間為種子生成了一個隨機數組,然后一個一個插入鏈表。

 

  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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM