递增单链表删除所有大于mink且小于maxK的元素。

来源:互联网 发布:真小人 伪君子知乎 编辑:程序博客网 时间:2024/06/02 06:51
Status ListDelete_L(LinkList &L,ElemType mink,ElemType maxk){//这个算法实现了每移动一次辅助指针p,就释放空间。LinkList p,q,prev=NULL;if(mink>maxk)return ERROR;p=L;prev=p;p=p->next;while(p&&p->data<maxk){if(p->data<=mink){prev=p;p=p->next;}else{prev->next=p->next;q=p;p=p->next;free(q);}}return OK;}
递增单链表删除所有大于mink且小于maxK的元素。
#include <stdio.h>#include <stdlib.h>#include <conio.h>typedef int ElemType;#define  ERROR -1#define  OK    1typedef struct LNode{ElemType data;LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n){LinkList p;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;for(int i=n;i>0;i--){p=(LinkList)malloc(sizeof(LNode));printf("请输入第%d个元素\n",i);scanf("%d",&p->data);p->next=L->next;L->next=p;}}//时间复杂度O(n),空间复杂度O(2),该算法对于释放空间的处理不好。void CutFun(LinkList &L,int mink,int maxk){LinkList p,q;q=p=L;while(q->next->data<=maxk){if (q->next!=NULL&&p->next->data<=mink){q=p=p->next;}if (q->next!=NULL&&q->next->data>mink&&q->next->data<=maxk){q=q->next;}if (q->next==NULL){q=NULL;//后面的都不要了break;}}p->next=q;}void main(){LinkList L,p;int n,mink,maxk;printf("输入元素个数:\n");scanf("%d",&n);CreateList(L,n);printf("输出元素:\n");p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n输入大于的最小值与小于的最大值\n");scanf("%d%d",&mink,&maxk);CutFun(L,mink,maxk);printf("输出元素:\n");p=L->next;while(p){printf("%d ",p->data);p=p->next;}getch();}