折半查找
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]為標(biāo)志位
for (j = i - 1; a[j] > a[0]; j--) {
a[j + 1] = a[j];
}
a[j + 1] = a[0];
}
}
}
判斷一個(gè)鏈表是否有環(huán)
#define Len 8
typedef int ElemType; // 假定數(shù)據(jù)類型為int
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *LinkList; // 定義鏈表中節(jié)點(diǎn)類型,包含一個(gè)數(shù)據(jù)域與指針域
// 判斷方式:使用兩個(gè)指針p1,p2從鏈表頭開始遍歷,p1每次前進(jìn)一步,p2每次前進(jìn)兩步。如果p2到達(dá)鏈表尾部,
//說明無環(huán),否則p1、p2必然會在某個(gè)時(shí)刻相遇(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)
// 需要三個(gè)指針,記錄當(dāng)前節(jié)點(diǎn)、前一個(gè)節(jié)點(diǎn)、后一個(gè)節(jié)點(diǎn)
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é)點(diǎn)方法:
只給定單鏈表中某個(gè)結(jié)點(diǎn)p(并非最后一個(gè)結(jié)點(diǎn),即p->next!=NULL)指針,刪除該結(jié)點(diǎn)。
辦法很簡單,首先是放p中數(shù)據(jù),然后將p->next的數(shù)據(jù)copy入p中,接下來刪除p->next即可。只給定單鏈表中某個(gè)結(jié)點(diǎn)p(非空結(jié)點(diǎn)),在p前面插入一個(gè)結(jié)點(diǎn)。
辦法與前者類似,首先分配一個(gè)結(jié)點(diǎn)q,將q插入在p后,接下來將p中的數(shù)據(jù)copy入q中,然后再將要插入的數(shù)據(jù)記錄在p中。