如何设计一个算法,在带头结点的单链表L(有序递增)删除所有值大于minv小于maxv的结点如何设

如题所述

设置三个指针,分别为psmall,pre,pbig,,分别用于指向第一个大于minv的节点,该节点的前一个节点,以及第一个大于maxv的指针
则只需进行psmall->next=pbig就可以删除区间[minv,maxv]的节点了,然后释放被删除的节点即可。
伪代码如下
Int DeleteNode(Link &L)
{
pre=head;//指向头节点
psmall=pbig=pre->next;
while(psmall&&psmall->data<minv)
{
pre=psmall;
psmall=psmall->next;
}
if(psmall)//找到了,继续寻找小于maxv的节点
{
pbig=psmall;//pbig直接从psmall指向的节点开始寻找
while(pbig&&pbig->data<maxv)
pbig=pbig->next;
}完成上述的步骤后,pre指向了刚好小于minv的节点,pbig指向刚好大于maxv的节点
pre->next=pbig;
while(psmall)
{
………………释放被删除节点,省略
}
return 1;
}
当然,具体的边界节点可能还需要楼主自己分析调试测验,但具体思路如上,希望可以帮助到你

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-19
一楼给的是标准答案。

虽然我很好奇在找到MIN的前驱之后,在找MAX的时候,为什么不直接把中间符合条件的节点删了,而是要再来一个循环来释放这些节点……

设计一个算法,在带头结点的单链表head中删除一个data域值最小的结点...
ListDeleteMax(L,&j);printf("删除最大元素%d后,链表的内容为:",j);ListTraverse(L);DestroyList(L);return 0;} void InitList(LinkList *L){ L = (LinkList )malloc(sizeof(LNode));if(!*L)exit(-1);(*L)->next = NULL;} int ListInsert(LinkList L,int i,int e){ int j...

有一个带头结点的单链表L,设计一个算法使其元素递增有序排列
\/* 插入排序法 *\/void sort(Linklist *&L){ LinkList *p=L->next, *q, *r; if(p!=NULL) { \/* 把链表分成两条,一条已经排序好了(L),一条待排序(p)*\/ r=p->next; p->next=NULL; p=r; \/* 对于所有待排序的元素 *\/ while(p!=NULL) { ...

求c语言,设带头节点的单链表L是一个递增有序表,试写一个函数,将x插入...
代码如图所示,望采纳!

有一个线性表(a1,a2,...,an),采用带头结点的单链表L存储.设计一算法将...
Status ListEmpty(LinkList L){ if(L->next)return FALSE;else return TRUE;} \/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 *\/ Status ClearList(LinkList *L){ LinkList p,q;p=(*L)->next; \/* p指向第一个结点 *\/ while(p) \/* 没到表尾 *\/ { q=p->ne...

...并以单链表作存储结构。试编写一个高效算法,删除表中所有
下面是用类C语言描述的算法 希望能对你有所帮助 呵呵 LinkedList LinkedListClear(LInkedList L){\/\/清空单链表,并释放节点所占空间 p=L->next;while(p!=NULL){ q=p->next;free(p);p=q;} L->next=NULL;return L;}

链表(带头结点)基本操作实验
删除操作如图 单链表的删除操作示意图 删除操作的算法实现如下:public T Delete(int i){ if (IsEmpty()|| i < 0){ Console.WriteLine("Link is empty or Position is error!");return default(T);} Node q = new Node();if (i == 1){ q = head;head = head.Next;return q.Data...

设计一个算法在带头结点的非空单链表L中第一个最大值结点之前插入一个值...
void InsertNode(LinkList head, datatype x) {LinkList p = head;LinkList q = (LinkList)malloc(sizeof(Node));q->data = x;while(p->next) {if(p->next->data > x) {q->next = p->next;p->next = q;return;}p = p->next;}p->next = q;\/\/x的值最大,所以放在表尾...

用算法实现:单链表和顺序表删除。删除顺序表中值相同的多余结点
{\/\/链式存储结构的直接插入排序算法,head是带头结点的单链表 RecNode *p,*q,*s; if ((head->next)&&(head->next->next))\/\/当表中含有结点数大于1 { p=head->next->next;\/\/p指向第二个节点 head->next=NULL; q=head;\/\/指向插入位置的前驱节点 ...

已知线性表的元素(整数)以值递增有序排列,并以单链表作存储结构。试编写...
\/\/创建一个链表 Node* CreateLink(int len,int MAX_BOUND = 100){ srand((unsigned int)time(NULL));LinkNode head = new Node(-1);LinkNode tmp = head;for (int i = 0; i < len; ++i){ tmp = tmp->_next = new Node(rand() % MAX_BOUND);} tmp->_next = NULL;return ...

编写程序,建立一个带有节点的单向链表,输入字符串,并按从小到大顺序组织...
int main(){ Link head; \/\/链表(不带头节点)int n;printf("输入链表的长度n: ");scanf("%d",&n);printf("连续输入%d个数据(以空格隔开): ",n);head=CreateLink(n);printf("\\n原本链表的节点是: ");DispLink(head);LinkSort(head);printf("\\n从大到小排序之后: ");DispLink(head)...

相似回答