设计算法以删除链表中值为x的结点``
【算法描述】:
删除给定值的结点关键是寻找此结点和最终的释放内存。查找此结点需要一个循环,定义的指针p指向头结点因为不是双链表所以p每次的指向必须为直接前驱,循环控制条件是如果p的直接后继不是我们要找的值并且p不是最后一个结点,循环就可以继续,对应的跳出循环有两种情况,第一种是找到了,删除释放内存,没找到就返回false主函数里给用户提示信息。
【算法实现】:
bool DeleteElement(node *L, elementType x) //参数是单指针链表和要删除的元素X
{
node *p = L; //定义一个指针p指向头结点(因为删除结点要指在被删除的直接前驱)
//注意循环体里的条件:p->next->data和x比较还是因为p必须指在被删除结点的前驱,另一个条件是p->next!=NULL即被删元素不能不存在
while(x!=p->next->data&&p->next!=NULL){
p=p->next;
}
if(p->next==NULL){
return false;
}
//执行删除操作
else{
u = new node;
u = p->next;
p->next = u->next;
delete u; //释放结点防止内存泄露
return true;
}
}
假设递增有序的带头结点的单循环链表 A、B 分别表示两个集合,设计算法以求解 A= A∪B,并分析算法的时间复杂度
【算法描述】
原链表递增有序就需要利用这一个条件,集合的基本要求是不能存在两个相同的元素,每一个链表从受元素结点开始扫描,每扫描到一个元素就比较大小,从而分成三种情况,新链表采用尾插法,既可以调用尾插法的函数也可以直接写语句(语句比较简单),本算法采取了后者,由于是尾插,所以在所有的元素插入到新表之后要把新表的尾指针置空。
【算法实现】
int UniteList(node *A, node *B, node *&L)
{
if(A->next==NULL||B->next==NULL){
//排除A或B表中有空表的情况
return 1;
}
else{
node *s; //新插入的元素结点
node *p;
p = A->next;
node *q;
q