考虑在链表第 i 个元素结点前插入数据元素的操作,说明为什么采用附加头结点能 够方便该操作的实现? 在带头结点的单链表中第i个元素前插入元素e

\u8bbe\u8ba1\u4e00\u4e2a\u5728\u4e0d\u5e26\u5934\u7ed3\u70b9\u7684\u94fe\u8868\u7684\u7b2ci\u4e2a\u5143\u7d20\u4e4b\u524d\u63d2\u5165\u4e00\u4e2a\u5143\u7d20\u7684\u7b97\u6cd5\u3002\u6c42\u9ad8\u624b \u6307\u70b9

#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct LNode { //\u7ed3\u70b9\u7c7b\u578b
ElemType data; // \u6570\u636e\u57df
struct Lnode *next; // \u6307\u9488\u57df
} LNode;

typedef LNode * LinkList; //\u5355\u94fe\u8868\u7c7b\u578b

Status ListInsert_L(LinkList &L, int i, ElemType e) {
// L \u4e3a\u4e0d\u5e26\u5934\u7ed3\u70b9\u7684\u5355\u94fe\u8868\u7684\u5934\u6307\u9488\uff0c\u5728\u94fe\u8868\u4e2d\u7b2ci \u4e2a\u7ed3\u70b9\u4e4b\u524d\u63d2\u5165\u65b0\u7684\u5143\u7d20 e
LNode *p = L;
int j = 1;
if(1==i)
{
s =(LNode*)malloc(sizeof(LNode)); // \u751f\u6210\u65b0\u7ed3\u70b9
if ( s == NULL) return ERROR;
s->data = e;
s->next = p; // \u63d2\u5165
L = s; // \u63d2\u5165
}
else{
while (p && j < i-1)
{ p = p->next; ++j; } // \u5bfb\u627e\u7b2c i-1 \u4e2a\u7ed3\u70b9
if (!p || j > i-1)
return ERROR; // i \u5927\u4e8e\u8868\u957f\u6216\u8005\u5c0f\u4e8e1
s =(LNode*)malloc(sizeof(LNode)); \u751f\u6210\u65b0\u7ed3\u70b9
if ( s == NULL) return ERROR;
s->data = e;
s->next = p->next; // \u63d2\u5165
p->next = s; // \u63d2\u5165
}
return OK;
} // LinstInsert_L

int j=1;
p=head;
while(jnext)
{
p=p->next;
j++;
}
if(j==i)
{
q=new node(e);
q->next=p->next;
p->next=q;
}
else
{
printf("\u94fe\u8868\u6ca1\u6709%d\u4e2a\u5143\u7d20",i);
}

如果添加头结点,在第0个元素节点前插入数据的实现逻辑和在任意元素节点前插入数据的实现逻辑相同。
如果不添加头结点,需要对插入位置进行判断:
如果是第0个元素,需要创建新节点,其next指向head,并且head修改指向为新节点;
如果不是第0个元素,直接找到第i-1个元素节点,插入新节点,其next指向第i个元素,同时修改第i-1个元素节点的next指向为新节点。

扩展阅读:下列哪个表述是正确的 a ... c链表删除所有重复元素 ... 链表查找第i个元素 ... 下列哪个表述是正准的 ... 按序号查找第i个元素 ... 删除链表中出现n次的元素 ... 下列哪种表述是正确的 ... 链表尾部增加删除元素 ... 在单链表中查找第i个结点 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网