編寫乙個完整的程式,實現單鏈表的建立、插入、刪除、輸出等基本操作。
(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...