一、 取值——取单链表中第i个元素的内容
算法步骤:
- 从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值p=L->next。
- j做计数器,累计当前扫描过的结点数,j初值为1。
- 当p指向扫描到的下一结点时,计数器j加1。
- 当j==i,p所指的结点就是要找的第i个结点。
Status GetElem_L(LinkList L,int i,ElemType &e){p=L->next;j=1;while(p&&j<i){ //向后扫描,直到p指向第i个元素或p为空p=p->next;++j;}if(!p||j>i) //第i个元素不存在return ERROR;e=p->data; //取第i个元素return OK;
}
二、 按值查找——根据指定数据获取该数据所在的位置(地址)
算法步骤:
- 从第一个结点起,依次和e相比较。
- 如果找到一个其值与e相等的数据元素,则返回其在链表中的“位置”或地址。
- 如果查遍整个链表都没有找到其值和e相等的元素,则返回0或者“NULL”。
Lnode *LocateElem_L(LinkList L,Elemtype e){//在线性表中查找值为e的数据元素p=L->next;while(p&&p->data!=e)p=p->next;return p;
}
根据指定数据获取该数据位置序号
int LocateElem_L(LinkList L,Elemtype e){
//返回L中值为e的数据元素的位置序号,查找失败返回0p=L->next;j=1;while(p && p->data!=e){p=p->next;j++;}if(p)return j;elsereturn 0;
}
三、 插入——在第i个结点前插入值为e的新结点
算法步骤:
- 首先找到ai-1的存储位置p。
- 生成一个数据域为e的新结点s。
- 插入新结点:新结点的指针域指向结点ai 结点ai-1的指针域指向新结点
Status ListLinsert_L(LinkList &L,int i,ElemType e){p=L;j=0;while(p&&j<i-1){ //寻找第i-1个结点,p指向i-1结点p=p->next;++j;}if(!p||j>i-1) return ERROR; //i大于表长加1或者小于1,插入位置非法s=new LNode; s->data=e; //生成新结点ss->next=p->next;p->next=s;return OK;
}
四、 删除——删除第i个结点
算法步骤:
- 首先找到ai-1的存储位置p,保存要删除的ai的值。
- 令p->next 指向ai+1。
- 释放结点ai的空间。
Status ListDelete_L(LinkList &L,int i,ElemType &e){p=L;j=0;while(p->next&&j<i-1){p=p->next;++j; //寻找第i个结点,使p指向前趋}if(!(p->next)||j>i-1)return ERROR;q=p->next; //临时保存被删结点的地址以备释放p->next=q->next; //改变删除结点前趋结点的指针域e=q->data; //保存删除结点的数据域delete q; //释放删除结点的空间return OK;
}
五、 建立单链表:头插法——元素插入在链表头部,也叫前插法
算法步骤:
- 从一个空表开始,重复读入数据。
- 生成新结点,将读入数据存放到新结点的数据域中。
- 从最后一个结点开始,依次将各结点插入到链表的前端。
void CreateList_H(LinkList &L,int n){L=new LNode;L->next=NULL; //建立一个带头结点的单链表for(i=n;i>0;--i){p=new LNode; //开辟新结点cin>>p->data; //输入元素值scanf(&p->data)p->next=L->next; //插到表头L->next=p;}
}
建立单链表:尾插法——元素插入在链表尾部,也叫做后插法
算法步骤:
- 从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
- 初始时,r同L均指向头结点。每读入一个数据元素则申请一个新结点,将新结点插入到尾节点后,r指向新结点。
void CreateList_R(LinkList &L,int n){L=new LNode;L->next=NULL;r=L; //尾指针r指向头结点for(i=0;i<n;++i){p=new LNode;cin>>p->data; //生成新结点,输入元素值p->next=NULL;r->next=p; //插入到表尾r=p; //r指向新的尾结点}
}