当前位置:首页 » 操作系统 » 删除算法链表

删除算法链表

发布时间: 2022-08-26 05:33:55

A. 单链表删除操作

// 删除节点,释放内存空间
p->next = p->next->next;
delete p->next;
******************************************
若链表为:
链表节点 | 1 | 2 | 3 |...
对应指针 | p | p->next | p->next->next|...

你想删除节点2(p->next),
但你的做法是:
p->next = p->next->next;(1的下一个由指向2改为指向3);
链表节点 | 1 | 2 | 3 |...
对应指针 | p | | p->next |...
delete p->next;(删除3)
这就错了,若要删除必须先将被删的节点2保存给临时变量,修改链表后再删除。正确的做法是:
linkList* tmp = NULL;
...
tmp = p->next;
p->next = p->next->next;
delete tmp;

另外,while (p && cnt != location - 1)这种写法虽然正确,但很不规范且危险,容易出现优先级和默认值的疏忽。

关于你补充的问题,不分析你的代码了,直接给你重写一个吧,看懂了就可以自己改了。
void Sort(linkList* L)
{
bool done_flag = FALSE;
linkList* p = L;
linkList* temp = NULL;

if (p->next == NULL)
{
return;
}

/*你的链表结构存在独立首节点,所以p可以直接做两个交换节点的父节点*/

/*若未发现乱序,说明已经排好*/
while(!done_flag)
{
done_flag = TRUE;

/*遍历链表 保证p下至少存在两个节点*/
while(p->next->next != NULL)
{
/*若顺序错误则对换*/
if (p->next->name[0] > p->next->next->name[0])
{
/*存在乱序*/
done_flag = FALSE;

/*链表:p p1 p2 p3*/
/*交换p1 p2*/

/*temp 指向 p1*/
temp = p->next;

/*p 的下一个改为 p2*/
p->next = p->next->next;

/*将 p3挂到p1后面,此时p的下一个是p2,所以p的下一个的下一个是p3,temp此时为p1*/
temp->next = p->next->next;

/*p 的下一个此时为 p2,将p2的下一个指向 temp(p1)*/
p->next->next = temp;
}

/*p后移*/
p = p->next;
}
}
}

bool你那里有问题的话,可以改为int或char。

结题吧。

B. C++数据结构链表删除算法中,del=first;first=first->link;delete del;是什么意思(尤其是第二句)

first是头指针,第一句让del指向首节点;,第二句是让first指向第二个节点,把第一个节点的指针域赋给first,而这个指针域指向第二个节点,故就是让first指向第二个节点;第三句,进行删除操作;这三句这应该在一个循环内,至此,此题已解,呵呵

C. 顺序表、单链表的删除算法

第三个位置的数的下标是2。如果顺序表最开始是12345,length等于5,那删除第三个位置的数后顺序表就变成了12455,而length变成了4,有效数据当然是1245。

D. 试编写一个在循环双向链表中进行删除操作的算法,要求删除的结点是指定结点p的前趋结点(自己创建链表)

要删除p节点的前驱,先定义一个节点q为p的前驱节点。有如下关系:
q->pre->next=p;
p->pre=q->pre;
然后删除q节点就可以了。

# include <iostream.h>
# include <assert.h>

template <class Type>
struct DbNode
{
Type data;
DbNode<Type> *next,*pre;

DbNode(DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):next(ptr1),pre(ptr2)
{}
DbNode(Type x,DbNode<Type> *ptr1 = NULL,DbNode<Type> *ptr2 = NULL):data(x),next(ptr1),pre(ptr2)
{}
};

template <class Type>
class DbList
{
public:
DbList()
{
head = new DbNode<Type>;
head->pre = head->next = head;
}

DbList(const DbList<Type> &dl)
{ }

~DbList()
{
Destory();
}
public:
void DeleteNode(DBNode<Type> *p)
{
DBNode<Type> *q=p->pre;

q->pre->next=p;
p->pre=q->pre;
delete q;
}

private:
DbNode<Type> *head;

void Destory()
{
DbNode<Type> *p = head->next;
while(p != head)
{
head->next = p->next;
p->next->pre = head;
delete p;
p = head->next;
}
}
};

E. 线性链表删除元素算法

#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int num; /*指数*/
struct node *next; /*指向下一个结点的指针*/
} *listnode;
void InitList(listnode L) /*初始化单链表*/
{
L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立头结点*/
L->next=NULL;
}
太扣了 一分也不给 但是我就是那种乐于助人的人 告诉不初始化 链表 接下来的 你要是给分我就给你写

F. 单链表的删除算法,为什么这道题选A而不选c呢求告知多谢!!!

C选项最后那句是free(q),但是我们要删除的是结点A,而不是A的下一个结点
A选项,把p的数据换成了下一个结点的数据,达到删除的目的,而同时下一个结点q就没有用了,那最后要free(q)

G. 求助C语言 单链表的插入、删除算法 的一些问题

第一个问题和第三个问题都是引用的意思,就是在函数中改变该变量的值会影响调用的地方的值,同时这样如果是大的对象,不是复制一个值而是原来的变量,只是一个别名。
第二个问题&&是与的意思,也就是说当p指针不为空并且j < i-1时候执行循环
最后一个三句话意思是删除一个元素,在此处删除的是指针q指向的元素,用q指向要删除的元素,然后第二句话是让当前指针的下一个元素指向q的下一个元素,也就是删除了q,然后把要删除的元素的值也就是data赋给e变量
不知道解释清楚了没有,要是不行再联系我。

H. 用循环单链表实现循环队列,如何写出插入和删除的算法

typedef struct CircleListNode{

Datatype d;

struct CircleList *pre,*nxt;

}*CircleList,CirListNode;

typedef struct

{

CircleList Head;

int num;

}CircleQueue;

void insertFront(CircleList *L,d);

{

if(!L)return NULL;

if(*L==NULL)

{

*L=(CircleList) malloc(sizeof(CirListNode));

*L->nxt= *L->pre=*L ;

*L->d=d;

}

else

{

CircleList p =(CircleList) malloc(sizeof(CirListNode));

p->nxt=*L;

p->pre=*L->pre;

*L->pre->nxt=p;

*L->pre=p;

*L=p;

}

}

I. 链表插入(删除)一个节点的算法

publi void deleteInO1(Node head,Node t){
if (head == null || t == null)
return;
if (t.next != NULL) {
Node tmp = t.next;
t.next = tmp.next;
t.val = tmp.val;
}
else { //待删除节点为尾节点
Node tmp = head;
while(tmp.next != t)
tmp = tmp.next;
tmp.next = NULL;
}
}

J. 设计一个在带头结点的单链表中删除第i个结点的算法

//删除节点 删除第i个节点
int Delete_Positon_LL(LinkList *phead,int i)
{
LinkList p,q;//p为值是x的节点,q是p的前一个节点
int j;

if((*phead)->next == NULL)//如果链表为空,做下溢处理
{
printf("单链表为空! ");

return 0;
}
if(i == 1) //如果是表头,表头后移
{

p=(*phead)->next;
(*phead)->next=(*phead)->next->next;
free(p);//释放表头


(10)删除算法链表扩展阅读:

链接方式存储的线性表简称为链表(Linked List)。链表的具体存储表示为:

① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)

② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))

链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

热点内容
和存储字长 发布:2025-05-15 21:54:09 浏览:514
用什么写c语言 发布:2025-05-15 21:35:56 浏览:418
linux读取u盘 发布:2025-05-15 21:32:13 浏览:508
c语言dos 发布:2025-05-15 21:18:17 浏览:664
sci编译英文 发布:2025-05-15 21:16:57 浏览:383
大猫如何设置密码 发布:2025-05-15 21:15:32 浏览:765
什么叫苹果版的和安卓版的手机 发布:2025-05-15 21:05:18 浏览:254
编程找点 发布:2025-05-15 20:43:10 浏览:588
php上传临时文件夹 发布:2025-05-15 20:43:00 浏览:658
impala数据库 发布:2025-05-15 20:42:12 浏览:650