單鏈表全部演算法

2021-06-22 07:21:24 字數 3158 閱讀 6968

本篇純粹體現鍊錶各種操作的具體**實現,採用了帶頭結點的單鏈表,廢話不多說,直接上**+注釋:

#include#include/*

鍊錶的結構

*/typedef struct lnode*linklist;

/* 列印鍊錶

*/void showlinklist(linklist&l);

/* 初始化鍊錶,使指標指向頭結點

*/void initlist(linklist&l);

/* 根據傳來的length引數順序建立多長的鍊錶

*/void createlinklistsequence(linklist&l,int length);

/* 根據傳來的length引數逆序建立多長的鍊錶

*/void createlinklistreverse(linklist&l,int length);

/* 在第i個位置之前插入結點值為data的結點

*/void insertlist(linklist&l, int i, int data);

/* 在第i個位置之前產出結點,並把結點的值返回給data

*/void deletelist(linklist&l, int i, int &data);

/* 對鍊錶進行排序(非遞減)

*/void sortlinklist(linklist&l);

/* 合併兩個非遞減的鍊錶

*/void mergetlinklist(linklist&l1, linklist&l2, linklist&l3);

/* 刪除重複的結點,使結點值至多出現一次,不改變結點之間的相對位置

*/void deleterepeatnode(linklist&l);

/* 對a表做操作,刪除a表中那些即在b表中出現又在c表中出現的元素

*/void deleterepeatnodeatalistblist(linklist&a, linklist&b, linklist&c);

/* 求兩個單鏈表表示的集合的交集,並將結果用乙個新的單鏈表儲存並返回

*/void subsettwolinklist(linklist&la, linklist&lb, linklist&lc);

/* 查詢鍊錶中倒數第k個位置的結點並返回該節點

*/linklist find_reverse(linklist&l, int k);

/* 將乙個單鏈表拆分成兩個單鏈表,原表保留值為偶數的節點,值為奇數的結點按次序組成新的連表

*/linklist splittooddnode(linklist&l);

/* //就地逆置鍊錶

*/linklist reverseposition(linklist&l);

int isorderlyincrease(linklist&l)

p = p->next;

} return flag;//1有序,0無序

}void showlinklist(linklist&l)

}void initlist(linklist&l)

l->next = null;

}void createlinklistsequence(linklist&l, int length)

}void createlinklistreverse(linklist&l, int length)

}void insertlist(linklist&l, int i, int data)

if (!p || j>i - 1)

linklist s = (linklist)malloc(sizeof(lnode));

s->data = data;

s->next = p->next;

p->next = s;

}void deletelist(linklist&l, int i, int &data)

if (!p || j>i - 1)

linklist s = p->next;

data = s->data;

p->next = s->next;

free(s);

}void sortlinklist(linklist&l)

} }}//將非遞減的l1和非遞減的l2合併成乙個l3的非遞減序列

void mergetlinklist(linklist&l1, linklist&l2, linklist&l3)

if (!isorderlyincrease(l2))

linklist p = l1->next;

linklist q = l2->next;

linklist s = l3;

while (p&&q)

else

} s->next = q ? q : p;

}//刪除重複的結點,使結點值至多出現一次,不改變結點之間的相對位置

void deleterepeatnode(linklist&l)

else

} }}//對a表做操作,刪除那些即在b表中出現又在c表中出現的元素

void deleterepeatnodeatalistblist(linklist&a, linklist&b, linklist&c)

}} s = p;

p = p->next; }}

//求兩個單鏈表表示的集合的交集,並將結果用乙個新的單鏈表儲存並返回

void subsettwolinklist(linklist&la, linklist&lb, linklist&lc)

} }}//查詢鍊錶中倒數第k個位置的結點並返回該節點

linklist find_reverse(linklist&l, int k)

p = p->next;

} return q;

}//將乙個單鏈表拆分成兩個單鏈表,原表保留值為偶數的節點,值為奇數的結點按次序組成新的連表

linklist splittooddnode(linklist&l)

else

} s->next = null;

return head;

}//就地逆置鍊錶

linklist reverseposition(linklist&l)

return head;

}

各個函式已經測試編譯通過,功能良好。

單鏈表演算法

遍歷 就是把單鏈表中的各個節點挨個拿出來,就叫遍歷 遍歷要點 不能遺漏,不能重複,追求效率 方法 從頭指標 頭節點 順著鍊錶掛接指標依次訪問鍊錶的各個節點,取出這個節點的資料,然後再往下乙個節點,知道最後乙個節點,結束返回 include include include 構建乙個鍊錶的節點 stru...

單鏈表演算法

設帶頭結點的非空單鏈表 l,設計乙個演算法刪除 l 中奇數序號 的結點,即刪除 l 中第 1 3 5 結點。應該是對的,唉,我也忘了 設計演算法刪除單鏈表奇數序號的節點 include include include define elemtype int typedef struct node l...

演算法 單鏈表之和

今天看到 待字閨中 的一道演算法題 兩個單鏈表,每乙個節點裡面乙個0 9的數字,輸入就相當於兩個大數了。然後返回這兩個數字的和 乙個新的list 這兩個輸入的list長度相等。要求 1 不用遞迴 2 要求演算法的時間和空間複雜度盡量低 分析 0 9之間的數相加,最大的進製是1,如果只要求遍歷兩個鍊錶...