C语言高手帮忙 已知线形表中的元素以值递增有序排列,并以单链表作存储结构。试编写一个高效算法,

删除该表所有值大于MIN且小于MAX的元素(若表中存在这样的元素),同时释放被删除节点的存储空间。
要完整地程序,不要伪代码!
正确加分哦!~

/*
C语言高手帮忙 已知线形表中的元素以值递增有序排列,并以单链表作存储结构。试编写一个高效算法,
删除该表所有值大于MIN且小于MAX的元素(若表中存在这样的元素),同时释放被删除节点的存储空间。
*/
#include <iostream>
#include <vector>
using namespace std;

//结点
struct Node
{
int data;
Node *pNext;
};

//构造一个链表的函数
Node *CreateList()
{
Node *pHead = new Node();
pHead->data = 1;
pHead->pNext = NULL;

Node *pWork = pHead;
for ( int i = 2 ; i <= 10 ; i++ )
{
pWork->pNext = new Node();
pWork = pWork->pNext;
pWork->data = i;
pWork->pNext = NULL;
}

return pHead;
}

//销毁一个链表的函数
void DestroyMyList(Node* &pHead)
{
while ( NULL != pHead )
{
Node *pWork = pHead->pNext;
delete pHead;
pHead = pWork;
}
pHead = NULL;
}

//输出一个链表
void OutPutList( Node* &pHead )
{
Node *pWork = pHead;
while ( NULL != pWork )
{
cout<<pWork->data<<"->";
pWork = pWork->pNext;
}
cout<<"NULL"<<endl;
}

//删除min与max之间的数据
void DeleteBetweenMinAndMax( Node* &pHead,int min,int max )
{
//定义一个可变长度的数组,来保存所有指向每个LIST结点的指针
vector<Node * > PointerArrToEveryNode;
Node *pWork = pHead;
while ( pWork != NULL )
{
//将每个结点的指针添加到数组中
PointerArrToEveryNode.push_back(pWork);
pWork = pWork->pNext;
}
//此时PointerArrToEveryNode数组中指针就是指向每个LIST结点的指针,下面查找min及max的位置并删除内容
for ( int i = 0 ; i < PointerArrToEveryNode.size() ; i++ )
{
if ( PointerArrToEveryNode[i]->data > min && PointerArrToEveryNode[i]->data < max )
{
delete PointerArrToEveryNode[i];//删除数据空间
PointerArrToEveryNode.erase(PointerArrToEveryNode.begin() + i);//在指针数组中删除元素
i--;//删除了一个元素后数组中的个数减少了,应该在i--处继续循环
}
}
//删除某些符合要求的结点后,链表的链可能断了,根据ointerArrToEveryNode数组中指针重建链
if ( PointerArrToEveryNode.size() > 0 )
{
for ( int i = 0 ; i < PointerArrToEveryNode.size() - 1 ; i++ )
{
PointerArrToEveryNode[i]->pNext = PointerArrToEveryNode[i+1];
}
//重新给头结点赋值
pHead = PointerArrToEveryNode[0];
//重新给尾结点赋值pNext指针
PointerArrToEveryNode[PointerArrToEveryNode.size()-1]->pNext = NULL;
}
else
{
//元素被删完了
pHead = NULL;
}
}

int main(void)
{
//测试函数是否正常
//先创建一个链表
Node *pHead = CreateList();
//输出删除前的内容
OutPutList(pHead);

//执行删除5和7之间的数据
DeleteBetweenMinAndMax(pHead,3,8);
//再输出删除后的内容
OutPutList(pHead);

//执行删除9和22之间的数据
DeleteBetweenMinAndMax(pHead,9,22);
//再输出删除后的内容
OutPutList(pHead);

//执行删除0和4之间的数据
DeleteBetweenMinAndMax(pHead,0,4);
//再输出删除后的内容
OutPutList(pHead);

//执行删除8和15之间的数据
DeleteBetweenMinAndMax(pHead,8,15);
//再输出删除后的内容
OutPutList(pHead);

//执行删除0和20之间的数据
DeleteBetweenMinAndMax(pHead,0,20);
//再输出删除后的内容
OutPutList(pHead);

//结束前销毁链表
DestroyMyList(pHead);

cin.get();
return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

...以值递增有序排列,并以单链表作存储结构。试编写一个高效算法,删除...
{\/\/清空单链表,并释放节点所占空间 p=L->next;while(p!=NULL){ q=p->next;free(p);p=q;} L->next=NULL;return L;}

...以值递增有序排列,并以单链表作存储结构。试编写一个高效算法,删除...
struct Node { public:Node():_val(0),_next(NULL){ } Node(int val):_val(val),_next(NULL){ } Node(int val,Node* next):_val(val),_next(next){ } ~Node(){ if (_next)delete _next;} public:int _val;Node* _next;};typedef Node* LinkNode;\/\/创建一个链表 Node* Crea...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找
bool InsertList(LinkList la,int i,int e){ \/\/在la链表中的i位置插入数值e int j=1;

代码在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链...
这是一个简单的单链表操作题。核心算法:用两个指针p,pre,其中pre指向p的直接前驱结点。比较p->data和pre->data是否相等,如果相等将p继续只想下一个结点(即:p=p->next),直到不相等为止。此时就要更新pre和p的值,删除pre和p之间的结点(即:pre->next=p;),接着让p指向pre的下一个结点(...

数据结构作业
2.8 假设有两个按元素值递增有序排列的线性表A和B,均以单链表①作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)的结点空间存放表C。①今后若不特别指明,链表均是指动态链表,且可以带头结点。 typedef int datatype; ...

【数据结构·C语言】请高手帮忙检查一个关于【链表归并】的算法是否正...
1. 您的算法不符合题意,题意是不要创建新的结点就是用原来的空间,所以您 C=(ElemType*)malloc(sizeof(LNode));应该是多余的。2. 您的算法因为AB是递增有序要改为递减有序,您就每次将指针移动到序列的最末端来进行比较和插入,由于是单向链表,这样你的算法会非常低效。3. 您仅仅需要将两个...

...两个单链表LA和LB,其元素均为非递减有序排列,编写一个算法。将他们...
}LinkList merge(LinkList LA,LinkList LB) {pNode a,b,c,head;a = LA;b = LB;c = head = GetNewList();head->data = LA->data + LB->data;while(a->next && b->next) {c->next = (pNode)malloc(sizeof(NODE));if(c->next == NULL) {printf("内存分配失败!\\n");...

请C语言高手帮我编写几个数据结构的小程序~(一定要用C++编写噢~)谢啦...
deQueue(q,e)==1)printf("出对元素为:%c\\n此时",e);numQueue(q);enQueue(q,'d'); enQueue(q,'e'); enQueue(q,'f');printf("def进队列后,");numQueue(q);printf("它的元素有:\\n");DispQueue(q);ClearQueue(q);} 这是我以前的作业,你自己组织下,应该可以解决你的问题 ...

已知递增有序的单链表 A,B和C分别存储了一个集合设计算法实现 A:=A∪...
la,lb,lc分别为A,B,C的大小,a,b,c存储其中的元素,A用来存最终的答案。bc数组存储的是 B∩C 的答案,lbc为 |B∩C| 思路如下:首先由于a,b,c都是递增的,所以可以利用它的单调性。在求 B∩C 时,两个指针分别指向链表头 (tb,tc) 若 b[tb]<c[tc] 那么和c[tc]相等的b集合中...

用C语言编写一个带头结点的线性链表,用以存放输入的二进制数,链表中每...
include "math.h"struct link { struct link *pre;char a;struct link *next;}LINK[10];void main(){ struct link *head,*p,*p1;struct link string[10];int i;printf("put in the string:\\n");for(i=0;i<10;i++){ scanf("%c",&(string[i].a));} for(i=0;i<10;i++)...

相似回答