1、假设线性表L采用单链表存储结构,设计一个算法,在L的数据元素最大值之前插入(假设L的各个数据元素值不同)数据元素x。
基本思想,先查找到最大元素对应的结点,再在之前插入x对应的结点;
设计算法时要考虑用到两组指针变量,一组(maxp,maxpre)记录最大元素的结点及其前驱,另一组结点用来遍历各个数据元素对应的结点及其前驱,(pre,p)
void insertmaxnode(LinkNode *&L, Elemtype x)
{ LinkNode *p=L->next,*pre=L,*maxp=p,*maxpre=pre;
LinkNode *p=L->next,*pre=L;
LinkNode *maxp=p,*maxpre=L,*s;
while (p!=NULL)
{
if (maxp->data<p->data)
{
maxp=p;
maxpre=pre;
}
pre=p; p=p->next;
}
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=maxpre->next;
maxpre->next=s;
}
LinkNode *p=L->next:p指向链表的第一个数据节点。
LinkNode *pre=L:pre指向头节点,用于记录p的前驱。
LinkNode *maxp=p:maxp初始化为第一个数据节点,用于记录当前最大值所在的节点。
LinkNode *maxpre=pre:maxpre初始化为头节点,用于记录最大值节点的前驱。
s=(LinkNode *)malloc(sizeof(LinkNode));
这行代码的作用是为新的链表节点分配内存,并将分配到的内存地址赋给指针s
。这样一来,s
就可以作为新节点的地址,通过它我们可以访问和操作这个新节点。
-
插入新节点:
- 在循环结束后,找到了链表中的最大值节点及其前驱。接下来,创建一个新的节点
s
,用于存储新插入的数据元素x:s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=x;
- 调整指针,将新节点s插入到最大值节点前:
s->next=maxpre->next; maxpre->next=s;
。这样,s就成为了原最大值节点的新前驱,而原最大值节点的前驱变为了s。
- 在循环结束后,找到了链表中的最大值节点及其前驱。接下来,创建一个新的节点