您现在的位置是:首页 >

一般单链表为空的判定条件是 单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。

火烧 2021-04-24 23:30:46 1048
单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。 单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。其实这个问题我当时

单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。  

单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。

其实这个问题我当时也迷糊了,后来想想其实也不难,呵呵,我们分析一下:
如果用C语言描述单链表如下:
typedef struct node{
DataType data;节点的数据域
struct node *next;节点的指针域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;p是节点
LinkList head;head是头指针
注意最后一句:"LinkList head",这是定义了一个头结点,前面已经用typedef定义了LinkList,既“typedef ListNode *LinkList;”这句,这就说明LinkList head 定义后 head实际上是一个LinkNode类型的指针,这是我们单单看最后两句的定义而忽略其字面意思而言的话,p和head实际上是同一种类型的变量,都是ListNode类型的指针,只不过最后一句LinkList类型是用typedef定义的,所以没有“*”号。
因为删除或者插入操作有时会修改实参的指针(比如头结点为空的时候插入节点,这是就修改了头结点),那么就必须将相应的形参说明为指针的指针,函数电泳时将实参指针的地址传递给相应的形参。例如:刚刚初始化的时候头结点head为空,如果这时插入节点p(由上可知p是ListNode*类型的,是个指针,把它当做地址)时应该是head=p;这就改变了head的地址,所以在传参数的时候,函数的形参一般都是"Insert(LinkList *head,DataType x)",
注意:head是ListNode*类型的,所以*head 是ListNode**类型的!

单链表的插入和删除操作中,为什么要用指向指针的指针

*next?前面一个结构体里的指针域中的指针指向下一个结构体变量

一般单链表为空的判定条件是 单链表的增加删除操作时为何特别需要注意指针操作的顺序如果指针操作顺序改变,会造成什么后果。

对链表操作时,操作顺序对操作结果有影响。因为链表有两个区域,数据域、指针域,指针域指向下一个元素的

你想问的是什么啊?
链表只能顺序存取的,线性表可以随机存取
链表中指针域是指向下一个元素的存储位置,即指针域的值为地址

单链表和双链表在执行删除操作时的区别

写双链表的删除操作时,一开始是采用单链表的方法。在执行的时候,删除非末尾节点还正常,但当删除的节点时最后一个节点时,执行时会返回位置(也就是指针)出错无法执行的情况。调试了好多次,也没找到原因。通过思考,最终找到了两者的区别,以下是两个操作的代码:
单链表删除:
Node *delete_element_list(Node *head,int i)
{
Node *p;
p=head;
int j = 0;
if(i>length(head)||i<1)
{
cout<<"error"<<endl;
return NULL;
}
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
Node *q;
q=p->next;
p->next=q->next;
free(q);
return head;
}
双链表删除:
Node *deleteElement(Node *head,int i)
{
if(i>length(head)||i<1)错误的删除位置
{
cout<<"error!"<<endl;
return NULL;
}
int j = 0;
Node *temp;
temp = head->next;
while(j<i-1&&temp)
{
j++;
temp = temp->next;
}
if(temp->next==NULL)
{
temp->prior->next=NULL;此步骤是关键,在删除最后一个节点时,需要将其的prior改为尾节点
free(temp);
}
else
{

temp->prior->next=temp->next;
temp->next->prior=temp->prior;
free(temp);
}
return head;
}
对于单链表,无需判断要删除的节点是否是尾节点。而对于双链表则需要判断。究其原因,单链表的节点直接只有一个next指针,在找到要删除的节点的前一个节点(temp)时直接将其next指向temp->next->next即可,若要删除的节点时尾节点,其指针则直接指向NULL,也就是temp直接变为最后一个节点操作成功。而对于双链表,若删除的节点是尾节点,这种方法显然是不行的。若已找到要删除的节点temp,它是尾节点,在执行temp->next->prior=temp->prior这一操作时显然会出错。因为temp->next的next为空,而NULL是没有prior的。也就是说需要提前判断一下要删除的节点是否是尾节点,若是则直接将temp->prior指向空,free(temp)即可。二者结构的不同决定了相应的操作也有差异。

对链表操作时,操作语句的顺序对操作结果又影响吗?为什么

差别很大。例如 q和p都是链表节点,
1、q=p;p=p->next;
2、p=p->next;q=p;语句相当,但顺序不同,这样就造成结果不同。
1、执行完,q是p的前趋,相当于q->next=p
2、执行完,p和q相等

单链表在插入和删除操作时无需移动链表结点

表述是正确的。 单链表的空间利用率比数组的空间利用率低,因为要有一定的空间来访指针。单链表适合插入和删除,因为不需要移动别的节点,而数组需要。数组更适合用于随机访问,因为单链表每次都需要从开始进行。

cookies如何删除?它的操作顺序!~

打开ie,工具菜单-〉inter选项-〉常规

线路停送电操作的顺序是什么?操作时有那些注意事项?

线路停电操作顺序是:拉开线路两端开关(注意拉开关的顺序),拉开线路两端线路侧闸刀、母线侧闸刀,在线路上可能来电的各端合接地闸刀(或挂接地线)。 线路送电操作顺序是:拉开线路各端接地闸刀(或拆除接地线),合上线路两端母线侧闸刀、线路侧闸刀,合上开关(注意合开关的顺序)。注意事项: ①.防止线路空载时,末端电压升高至允许值以上; ②.投入或切除空载线路时,防止电网电压产生过大波动; ③.防止在无负荷情况下投入空载线路时,发电机产生自励磁。

  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码