#include"slist.h" void InitList(List *list) { ?? list->first = list->last = (Node*) malloc ( sizeof (Node)); //頭結點 ?? assert (list->first != NULL); ?? list->first->next = NULL; ?? list->size = 0; } //push_back的優化 void push_back(List *list, ElemType x) { ?? insert(list, end(list), x); } //push_front的優化 void push_front(List *list, ElemType x) { ?? insert(list, begin(list), x); } void show_list(List *list) { ?? //step 1:指針p指向單鏈表的第一個結點 ?? Node *p = list->first->next; ?? //step 2:循環打印結點的信息 ?? while (p != NULL) { ???? printf ( "%d->" , p->data); ???? p = p->next; ?? } ?? printf ( "Nul.\n" ); } void pop_back(List *list) { ?? //step 1:判斷單鏈表是否為空 ?? if (list->size == 0) return ; ?? //step 2:定義指針p使其指向目標結點的前一個結點 ?? Node *p = list->first; //從頭結點開始 ?? while (p->next != list->last) ???? p = p->next; ?? //step 3:刪除目標結點 ?? free (list->last); ?? list->last = p; ?? list->last->next = NULL; ?? //step 4:更新單鏈表的長度 ?? list->size--; } void pop_front(List *list) { ?? //step 1:判斷單鏈表是否為空 ?? if (list->size == 0) return ; ?? //step 2:定義指針p使其指向目標結點的前一個結點 ?? Node *p = list->first->next; ?? //step 3:刪除目標結點 ?? list->first->next = p->next; ?? free (p); ?? //step 4:判斷刪除的結點是否是單鏈表的最后一個結點,若是則更新單鏈表的尾指針 ?? if (list->size == 1) ???? list->last = list->first; ?? //step 4:更新單鏈表的長度 ?? list->size--; } //insert_val的優化 void insert_val(List *list, ElemType x) { ?? //step 1:創建一個新的結點 ?? Node *s = CreateNode(x); ?? //step 2:定義指針p使其指向待插入位置的前一個結點 ?? Node *p = list->first; //從頭結點開始 ?? while (p->next != NULL && p->next->data < s->data) ???? p = p->next; ?? //step 3:判斷結點的待插入位置是否是表尾,若是則更新單鏈表的尾指針 ?? if (p->next == NULL) ???? list->last = s; ?? //step 4:插入結點 ?? s->next = p->next; ?? p->next = s; ?? //step 5:更新單鏈表長度 ?? list->size++; } Node* find(List *list, ElemType x) { ?? //step 1:指針p指向單鏈表的第一個結點 ?? Node *p = list->first->next; ?? //step 2:按照循環順序查找鏈表結點 ?? while (p != NULL && p->data != x) ???? p = p->next; ?? return p; } int length(List *list) { ?? return list->size; } void delete_val(List *list, ElemType x) { ?? //step 1:判斷單鏈表是否為空 ?? if (list->size == 0) return ; ?? //step 2:確定結點在單鏈表中的位置,并判斷其是否存在于單鏈表中 ?? Node *p = find(list, x); ?? if (p == NULL) { ???? printf ( "要刪除的數據不存在!\n" ); ???? return ; ?? } ?? //step 3:判斷結點位置是否是表尾 ?? if (p == list->last) //是表尾 ???? pop_back(list); ?? else { //不是表尾 ???? Node *q = p->next; ???? p->data = q->data; ???? p->next = q->next; ???? free (q); ???? list->size--; ?? } } void sort(List *list) { ?? //step 1:判斷單鏈表中的結點數是否為0或1 ?? if (list->size == 0 || list->size == 1) return ; ?? //step 2:將單鏈表中第一個結點之后的鏈表部分截出,方便重新按順序插入鏈表之中 ?? Node *s = list->first->next; // 指針s指向單鏈表的第一個節點 ?? Node *p = s->next; //q指向s后面的結點 ?? list->last = s; //單鏈表的尾指針指向單鏈表的第一個結點 ?? list->last->next = NULL; //截斷鏈表 ?? //step 3:將截出的鏈表中的結點根據其數據域大小重新插入到原來鏈表中 ?? while (p != NULL) { ???? s = p; ???? p = p->next; ???? Node *q = list->first; ???? while (q->next != NULL && q->next->data < s->data) ?????? q = q->next; ???? if (q->next == NULL) //判斷q此時指向的是否是單鏈表的最后一個結點,若是則更新鏈表的尾指針 ?????? list->last = s; ???? //將結點重新插入鏈表 ???? s->next = q->next; ???? q->next = s; ?? } } void reverse(List *list) { ?? //step 1:判斷單鏈表中的結點數是否為0或1 ?? if (list->size == 0 || list->size == 1) return ; ?? //step 2:將單鏈表中第一個結點之后的鏈表部分截出,然后將截出的鏈表中的結點按頭插法重新插入到原鏈表中 ?? Node *p = list->first->next; ?? Node *q = p->next; ?? list->last = p; ?? list->last->next = NULL; ?? while (q != NULL) { ???? p = q; ???? q = q->next; ???? p->next = list->first->next; ???? list->first->next = p; ?? } } void clear(List *list) { ?? //step 1:判斷單鏈表是否為空 ?? if (list->size == 0) return ; ?? //step 2:釋放單鏈表中的每一個結點 ?? Node *p = list->first->next; ?? while (p != NULL) { ???? list->first->next = p->next; ???? free (p); ???? p = list->first->next; ?? } ?? //step 3:頭指針和尾指針重新都指向頭結點 ?? list->last = list->first; ?? //step 4:更新鏈表長度 ?? list->size = 0; } void destroy(List *list) { ?? //step 1:清空單鏈表 ?? clear(list); ?? //step 2:釋放頭結點 ?? free (list->first); ?? //step 3:頭指針和尾指針都賦值為空 ?? list->first = list->last = NULL; } //優化 Node* CreateNode(ElemType x) { ?? Node *s = (Node*) malloc ( sizeof (Node)); ?? assert (s != NULL); ?? s->data = x; ?? s->next = NULL; ?? return s; } Node* begin(List *list) { ?? return list->first->next; } Node* end(List *list) { ?? return list->last->next; } void insert(List *list, Node *pos, ElemType x) { ?? //step 1:創建一個新的結點 ?? Node *s = CreateNode(x); ?? //step 2:確定帶插入位置 ?? Node *p = list->first; ?? while (p->next != pos) ???? p = p->next; ?? //step 3:插入結點 ?? s->next = p->next; ?? p->next = s; ?? //step 4:判斷結點是否插入到鏈表的表尾,若是則更新單鏈表的表尾指針 ?? if (pos == NULL) ???? list->last = s; ?? //step 5:更新單鏈表長度 ?? list->size++; } |