折半查找
int search(int *a, int n, int key) {
int min, max, mid;
min = 0;
max = n - 1;
for (int i = min; i <= max; i ++) {
mid = (min + max) / 2;
if (key < a[mid]) {
max = mid - 1;
} else if (key > a[mid]) {
min = mid + 1;
} else {
return mid;
}
}
return -1;
}
冒泡排序
void sort0(int *a, int n) {
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n - i - 1; j ++) {
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
}
選擇排序
void sort1(int *a, int n) {
for (int i = 0; i < n; i ++) {
int tag = i;
for (int j = 0; j < n - i; j ++) {
if (a[tag] > a[j]) {
tag = j;
}
}
if (tag != i) {
int temp = a[i];
a[i] = a[tag];
a[tag] = temp;
}
}
}
插入排序
void sort2(int *a, int n) {
int i, j;
for (i = 2; i < n; i ++) {
if (a[i - 1] > a[i]) {
a[0] = a[i]; // 其中a[0]為標志位
for (j = i - 1; a[j] > a[0]; j--) {
a[j + 1] = a[j];
}
a[j + 1] = a[0];
}
}
}
判斷一個鏈表是否有環(huán)
#define Len 8
typedef int ElemType; // 假定數(shù)據(jù)類型為int
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *LinkList; // 定義鏈表中節(jié)點類型犬第,包含一個數(shù)據(jù)域與指針域
// 判斷方式:使用兩個指針p1,p2從鏈表頭開始遍歷,p1每次前進一步芒帕,p2每次前進兩步。如果p2到達鏈表尾部丰介,
//說明無環(huán)背蟆,否則p1鉴分、p2必然會在某個時刻相遇(p1==p2),從而檢測到鏈表中有環(huán)带膀。
int hasLoop(LinkList L) {
LinkList p, q;
p = L;
q = L;
while (p && q) {
p = p->next;
q = q->next;
if (q) {
q = q->next;
}
if (p && p == q) {
return 1;
}
}
return 0;
}
鏈表反轉(zhuǎn)
// 需要三個指針志珍,記錄當前節(jié)點、前一個節(jié)點垛叨、后一個節(jié)點
LinkList reverseList(LinkList *L) {
LinkList pre, cur, next;
pre = *L;
cur = pre->next;
next = NULL;
pre->next = NULL;
while (cur) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
鏈表刪除結(jié)點方法:
只給定單鏈表中某個結(jié)點p(并非最后一個結(jié)點伦糯,即p->next!=NULL)指針,刪除該結(jié)點嗽元。
辦法很簡單敛纲,首先是放p中數(shù)據(jù),然后將p->next的數(shù)據(jù)copy入p中,接下來刪除p->next即可剂癌。只給定單鏈表中某個結(jié)點p(非空結(jié)點)淤翔,在p前面插入一個結(jié)點。
辦法與前者類似佩谷,首先分配一個結(jié)點q旁壮,將q插入在p后,接下來將p中的數(shù)據(jù)copy入q中谐檀,然后再將要插入的數(shù)據(jù)記錄在p中抡谐。