按位序插入(带头节点)
ListInsert(&L,i,e):插入操作,在表L中的第i个位置插入指定的元素e
在第i个位置插入元素e(带头结点)
网络异常,图片无法展示
|
bool ListInsert(LinkList &L, int i, ElemType e){ if(i<1) return false; LNode *p; //指针p指向当前扫描到的结点 int j=0; //当前p指向的是第几个节点 p=L; //L指向头结点,头结点是第0个结点(不存数据) while(p!=Null && j<i-1){ //循环找到第i-1个结点 p=p->next; j++; } if(p==Null) return false; LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return true; //插入成功 }
分析:如果i = 4 (插在表中),首先p会指向头结点,经过while循环后p会指向a3,通过malloc会申请一个结点,s指要插入的数据e,然后将s的下一个结点指向p的下一个结点,即a4;p的下一个结点在指向s;这样就完成了数据e的插入。
时间复杂度的: T(n) = O(n)
按位序插入(不头节点)
ListInsert(&L,i,e):插入操作,在表L中的第i个位置插入指定的元素e
在第i个位置插入元素e(带头结点),不存在第0个结点,因此在i=1的时需要特殊处理,思路和有带头结点相似
if(i==1){ LNode *s = (LNOde *)malloc(sizeof(LNode)); s->data = s; s->next = L; L = s; //头指针指向新结点 return true; }
当i=1的时候需要更改头指针L,当i>1的时候和带头结点代码逻辑是一样的
指定结点的前插操作
前插操作:在p结点之前插入结点s
网络异常,图片无法展示
|
分析思路:先把需要插入的新结点s还是插入到p结点后,即s结点的下一个结点还是指向p的下一个结点,p的下一个结点还是指向s;定义一个temp数据存储p的数据,从而达到p的data和s的data数据交换,这样就达到了前插操作,及在p结点之前插入结点s;
代码实现:
bool InsertProiorNode(LNode *p, LNOde *s){ if(p==Null || s==Null) retrun false; s->next=p->next; p->next=s; ElemType temp=p->data; p->data=s->data; s->data=temp; retrun true; }