已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试设计一个高效的算法,删除表中所有值大于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