資料結構實驗 單鏈表

2022-09-23 14:12:07 字數 3542 閱讀 9889

編寫乙個完整的程式,實現單鏈表的建立、插入、刪除、輸出等基本操作。

(1)建立乙個帶頭結點的單鏈表。

(2)計算單鏈表的長度,然後輸出單鏈表。

(3)查詢值為x的直接前驅結點q。

(4)刪除值為x的結點。

(5)把單向鍊錶中元素逆置(不允許申請新的結點空間)。

(6)已知單鏈表中元素遞增有序,請寫出乙個高效的演算法,刪除表中所有值大於mink且小於maxk的元素(若表中存在這樣的元素),同時釋放被刪結點空間,並分析你的演算法的時間複雜度(注意:mink和maxk是給定的兩個參變數,他們的值可以和表中的元素相同,也可以不同)。

(7)同(6)的條件,試寫一高效的演算法,刪除表中所有值相同的多餘元素(使得操作後的線性表中所有元素的值均不相同),同時釋放被刪結點空間,並分析你的演算法時間複雜度。

(8)利用(1)建立的鍊錶,實現將其分解成兩個鍊錶,其中乙個全部為奇數,另乙個全部為偶數(盡量利用已知的儲存空間)。

(9)在主函式中設計乙個簡單的選單,分別測試上述演算法。

[cpp]

//因為沒有要求輸入的鍊錶資料的數量,所以我用-1表示輸入結束。  

//測試資料 1 2 3 4 5 6 -1  

//測試刪除相同元素的資料 2 2 3 3 4 4 5 5  

#include  

#include  

struct node 

; node *h,*h1,*h2; 

void creatlist()//建立鍊錶  

e->next=null; 

return ; 

} void printlist(node *h)//輸出鍊錶  

printf("單鏈表長度:           %d\n",count); 

if(count==0) 

printf("單鏈表資料:           "); 

s=h; 

while(s->next!=null) 

printf("\n"); 

return ; 

} void findlist()//查詢值為x的前驅結點  

e=s->next; 

while(e->data!=x&&e->next!=null) 

if(e->data!=x) 

printf("%d的前驅結點為:        %d\n",x,s->data); 

return ; 

} void deletlist()//刪除值為x的結點,實驗中沒有要求,我寫的時候是按鍊錶中只有乙個值為x的結點。  

if(e->data!=x) 

s->next=e->next; 

free(e); 

return ; 

} void inverlist()//逆置鍊錶,將連線鍊錶的指標方向倒轉,不需要申請新的空間。  

s->next=null; 

r=e->next; 

while(e!=null) 

h->next=s; 

return ; 

} void delexylist()//刪除鍊錶中x和y之間的數字,而且要求釋放記憶體。既然要求釋放記憶體,那就只能遍歷,我沒想到什麼更高效的演算法,因為鍊錶是有序的,我釋放到值為y結束。  

else 

r=s; 

s=e; 

} return ; 

} void delesamelist()//刪除相同元素的結點同時釋放記憶體空間。同樣需要遍歷,沒有想到特別高效的演算法。  

else 

s=e;     

} return ; 

} void cutlist()//分拆鍊錶。  

else 

s=s->next;//第一次寫的時候沒有加上這一句,電腦直接就卡死了。。。。  

} printlist(h1); 

printlist(h2); 

return ; 

} int opra() 

return 1; 

} int main() 

printf("謝謝使用!\n"); 

return 0; 

}    

//因為沒有要求輸入的鍊錶資料的數量,所以我用-1表示輸入結束。

//測試資料 1 2 3 4 5 6 -1

//測試刪除相同元素的資料 2 2 3 3 4 4 5 5

#include

#include

struct node

;node *h,*h1,*h2;

void creatlist()//建立鍊錶

e->next=null;

return ;

}void printlist(node *h)//輸出鍊錶

printf("單鏈表長度:           %d\n",count);

if(count==0)

printf("單鏈表資料:           ");

s=h;

while(s->next!=null)

printf("\n");

return ;

}void findlist()//查詢值為x的前驅結點

e=s->next;

while(e->data!=x&&e->next!=null)

if(e->data!=x)

printf("%d的前驅結點為:        %d\n",x,s->data);

return ;

}void deletlist()//刪除值為x的結點,實驗中沒有要求,我寫的時候是按鍊錶中只有乙個值為x的結點。

if(e->data!=x)

s->next=e->next;

free(e);

return ;

}void inverlist()//逆置鍊錶,將連線鍊錶的指標方向倒轉,不需要申請新的空間。

s->next=null;

r=e->next;

while(e!=null)

h->next=s;

return ;

}void delexylist()//刪除鍊錶中x和y之間的數字,而且要求釋放記憶體。既然要求釋放記憶體,那就只能遍歷,我沒想到什麼更高效的演算法,因為鍊錶是有序的,我釋放到值為y結束。

else

r=s;

s=e;

} return ;

}void delesamelist()//刪除相同元素的結點同時釋放記憶體空間。同樣需要遍歷,沒有想到特別高效的演算法。

else

s=e; 

} return ;

}void cutlist()//分拆鍊錶。

else

s=s->next;//第一次寫的時候沒有加上這一句,電腦直接就卡死了。。。。

} printlist(h1);

printlist(h2);

return ;

}int opra()

return 1;

}int main()

printf("謝謝使用!\n");

return 0;

單鏈表 資料結構實驗

資料結構實驗 單鏈表 實現順序表的各種基本運算 並在此基礎上設計乙個主程式,完成如下功能 1 初始化順序表l 元素型別為char型 2 依次採用尾插法插入a,b,c,d,e元素 3 輸出順序表l 4 輸出順序表l的長度 5 判斷順序表l是否為空 6 輸出順序表l的第3個元素 7 輸出元素 a 的位置...

資料結構 實驗2 單鏈表

問題描述 設計乙個單鏈表操作演示程式。基本要求 設計實現乙個帶頭結點的單鏈表的操作演示程式,提供乙個使用者介面,可演 示的基本功能包括 1 初始化單鏈表 2 輸入並建立單鏈表 頭插入法 尾插入法均可 3 輸出單鏈表中的元素 4 在單鏈表指定位置插入元素 5 在單鏈表指定元素之前插入元素 6 刪除單鏈...

資料結構實驗 單鏈表 C 實現

下面是源 include define ok 1 define error 0 define elems 10 define link x static cast x using namespace std typedef struct lnode link,position typedef int...