已知線性表中的元素以值遞增有序排列,並以單鏈表作存儲結構。試設計一個高效的算法,刪除表中所有值大於mink和且小於maxk的元素
(若表中存在這樣的元素),同時釋放被刪結點空間(注意:mink和maxk是給定的兩個參變量。它們的值可以和表中的元素相同,也可以不同)
思路:找到第一個大於mink的數,標記位置,再向前找到第一個不小於maxk位置,標記前一個位置,刪除兩個標記之間的元素,並釋放空間
#include <stdio.h> #include <stdlib.h> #define N 8 #define DataType int struct SqList{ DataType data; struct SqList *next; }SqList; void AddNode(struct SqList* &head) { int i = 0; // struct SqList *q = s;//引用一個空指針會出問題 // for(i=0;i<N;i++) // { // scanf("%d",&(q->data)); // q->next = (struct SqList *)malloc(sizeof(SqList)); // q = q->next; // } // q = NULL;//無法將一個已經存開辟空間的指針強制轉換成NULL // while(1)//不加頭結點 // { // scanf("%d",&(q->data)); // if(i < N-1) // { // q->next = (struct SqList *)malloc(sizeof(SqList)); // q = q->next; // } // else{ // break; // } // i ++; // } // q->next = NULL; struct SqList *q = head; for(i = 0;i < N;i ++) { //q = q->next;//游離指針不可賦值給其它指針, q->next = (struct SqList *)malloc(sizeof(SqList)); q = q->next; scanf("%d",&(q->data)); } q->next = NULL; } void ShowList(struct SqList* head) { struct SqList *p = head->next; while(p) { printf("%d ",p->data); p = p->next; } } void DeleteNode(struct SqList* &head,int mink,int maxk)//要加頭結點,否則如果要刪除首結點則不易刪除 { struct SqList *p = head,*q = NULL,*tmp,*tmp1; while(p->next && p->next->data <= mink)//p指向最后一個不大於mink的元素 p = p->next; if(p->next)//如果還有比mink更大的元素 { q = p->next; while(q && q->data < maxk)//q指向第一個不小於maxk的元素 q = q->next; //刪除結點並釋放空間 tmp = p->next; while(tmp != q) { tmp1 = tmp->next;//先暫時保存待釋放結點的下一個結點 free(tmp); tmp = tmp1; } p->next = q; } } int main() { struct SqList *head = (struct SqList *)malloc(sizeof(SqList));//鏈表名和重定義名應該相同 int mink = 5,maxk = 16; AddNode(head); //ShowList(head); DeleteNode(head,mink,maxk); ShowList(head); return 0; } //1 2 5 7 10 19 23 26 //5 16 //3 25 //0 23 //0 27