本篇純粹體現鍊錶各種操作的具體**實現,採用了帶頭結點的單鏈表,廢話不多說,直接上**+注釋:
#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,如果只要求遍歷兩個鍊錶...