資料結構和演算法(三)

2021-10-24 16:21:50 字數 3457 閱讀 6515

作業分析講解

***************=

1.  結構體相關的

結構體變數之間可以直接賦值

結構體變數比較不能用 ==   >    <

判斷結構體大小,把結構體中所有的成員乙個個比較

雙向迴圈鍊錶

**********====

1. 在雙向鍊錶的基礎上,首尾相接

while(p!=null)  --》while(p!=head)

注意:雙向迴圈鍊錶,插入和刪除注意最後乙個節點的寫法發生改變,中間位置的節點寫法一樣

核心鍊錶  棧    佇列   樹和二叉樹   bst  

**********==

#include "myhead.h"

//封裝乙個結構體表示單鏈表

typedef struct siglist

list,*plist;

//鍊錶的初始化

plist init_list()

//插入資料(尾部插入)

int insert_tail(int newdata,plist head)

//插入資料,中間插入 把newdata插入到olddata的後面

int insert_mid(int olddata,int newdata,plist head)

//迴圈結束,並且最後乙個節點也不等於olddata,說明沒有olddata

if(p->next==null && p->data!=olddata)

//把新的節點插入到p的後面

newnode->next=p->next;

p->next=newnode;

return 0;

}//單鏈表刪除,只用乙個指標(有bug的,刪除不乾淨)

int remove_list(int deldata,plist head)

//刪除p後面的乙個節點

p->next=p->next->next; //刪除得不夠徹底

return 0;

}//用兩個指標刪除節點

int remove_list2(int deldata,plist head)

p=p->next;

q=q->next;

} //判斷最後乙個節點,剛才迴圈漏掉了

if(p->data==deldata)

//判斷deldata不存在的情況

if(flag==0)

return 0;

}//每次刪除鍊錶的最後乙個節點

int remove_tail(plist head)

//刪除節點

q->next=p->next;

p->next=null;

free(p);

return 0;

}//鍊錶的銷毀--》從最後乙個節點開始(從後往前)乙個個刪除

int destroy_list(plist head)

for(int i=0; inext;

//迴圈刪除

while(q!=null)

return 0;

}//列印鍊錶

int show_list(plist head)

return 0;

}int main()

#include "myhead.h"

//定義乙個結構體表示雙向鍊錶

struct doublelist

;//初始化

struct doublelist *init_list()

//尾插

int insert_tail(int newdata,struct doublelist *head)

//中間插入 把newdata插入到olddata的後面

int insert_mid(int olddata,int newdata,struct doublelist *head)

//判斷olddata不存在的情況

if(p==null)

//特殊情況 p剛好指向最後乙個節點時候

if(p->next==null)

else

}//刪除

int remove_list(int deldata,struct doublelist *head)

//判斷deldata不存在的情況

if(p==null)

//判斷p是最後乙個節點的情況

if(p->next==null)

else }

//列印

int show_list(struct doublelist *head)

return 0;

}//銷毀鍊錶

int destroy_list(struct doublelist *head)

//單獨刪除最後乙個節點

head->next=null;

p->prev=null;

free(p);

p=null;

}int main()

#include "myhead.h"

//定義乙個結構體表示雙向迴圈鍊錶

struct doublelist

;//初始化

struct doublelist *init_list()

//尾插

int insert_tail(int newdata,struct doublelist *head)

//中間插入 把newdata插入到olddata的後面

int insert_mid(int olddata,int newdata,struct doublelist *head)

//判斷olddata不存在的情況

if(p==head)

//特殊情況 p剛好指向最後乙個節點時候

if(p->next==head)

else

}//刪除

int remove_list(int deldata,struct doublelist *head)

//判斷deldata不存在的情況

if(p==head)

//判斷p是最後乙個節點的情況

if(p->next==head)

else //刪除中間的節點 }

//列印

int show_list(struct doublelist *head)

return 0;

}//銷毀鍊錶

int destroy_list(struct doublelist *head)

//單獨刪除最後乙個節點

p->prev->next=head;

head->prev=p->prev;

p->prev=null;

p->next=null;

free(p);

p=null;

}int main()

資料結構和演算法緒論(三)

1 線性表 什麼是線性表?例如 按照學號排序的班級花名冊,同乙個學號不可能有2名相同的同學 什麼是抽象資料型別?int float char等這種相同型別的資料集合整合在一塊稱之為抽象資料型別 什麼是線性表的抽象資料型別?什麼是線性表的順序儲存結構?插入操作 刪除操作 什麼是線性表鏈式儲存結構?元素...

資料結構和演算法(三)希爾排序

希爾排序是一種基於插入排序的排序演算法。對於大規模的亂序陣列,插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點從陣列的一端移動到另一端。希爾排序為了加快速度簡單的改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序 希爾排序的思想是使陣列中任意...

資料結構和演算法

判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...