类型定义:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
变量定义:
LinkList L;
LNode *p,*s;
重要操作
p=L;//p指向头结点
s=L->next;//s指向首元结点
p=p->next;//p指向下一结点
取值一 取单链表中第i个元素的内容
从链表的头指针出发,顺着链域next逐个结点往下搜索,直至搜索到第i个结点为止。因此,链表不是随机存取结构
算法描述:
Status GetElem_L(LinkList L,int i,ElemType &e){//获取线性表L中的某个数据元素的内容,通过变量e返回
p=L->next;j=1;//初始化
while(P&&j<i){//向后扫描,直到p指向第i个元素或p为空
p=p->next;++j;
}
if(!p|| j>i) return ERROR;//第i个元素不存在
e=p->data;//取第i个元素
return OK;
}//GetElem_L
按值查找一根据指定数据获取该数据所在的位置(地址)
[算法步骤]
1.从第一个结点起,依次和e相比较。
2.如果找到一个其值与e相等的数据元素,则返回其在链表中的“位置"或地址;
算法描述
Lnode *LocateELem_L(LinkList L,Elemtype e){
//在线性表L中查找值为e的数据元素
//找到,则返回L中值为e的数据元素的地址,查找失败返回NULL
p=L->next;
while(p &&p->data!=e)
p=p->next;
return p;
}
按值查找一 根据指定数据获取该数据位置序号
算法描述:
int LocateELem_L(LinkList L, Elemtype e){//在线性表L中查找值为e的数据元素的位置序号
//返回L中值为e的数据元素的位置序号,查找失败返回0
p=L->next;j=1;
while(p&&p->data!=e){
p=p->next;j++;
}
if(p){
return j;
else return 0;
}
插入一在第i个结点前插入值为e的新结点
算法步骤:
1、首先找到a;-1的存储位置p。
2、生成一个数据域为e的新结点s。
3、插入新结点:①新结点的指针域指向结点a;
②结点a;-1 的指针域指向新结点
①s-> next = p -> next;
②p-> next= S;
算法描述:
//在L中第i个元素之前插入数据元素e
Status Listlnsert_L(LinkList &L,int i,ElemType e){
p=L;j=0;
while(p && j<i-1){
p=p->next;++j;//寻找第i-1个结点,p指向i-1结点
}
if(!p || j>i-1){
return ERROR;// i大于表长+1或者小于1,插入位置非法
s = new LNode; s->data = e;//生成新结点s,将结点s的数据域置为e
s->next=p->next;//将结点s插入L中
p->next=s;
return OK;
}//ListInsert L
删除一删除第i个结点
[算法步骤]
1、首先找到ai-1的存储位置p,保存要删除的ai的值
2、令p-> next指向ai1。
3、释放结点ai的空间。
算法描述:
//将线性表L中第i个数据元素删除
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;
}//ListDelete_L
建立单链表:头插法----元素插入在链表头部,也叫头插法
1.从一个空表开始,重复读入数据;
2.生成新结点,将读入数据存放到新结点的数据域中
3.从最后一个结点开始,依次将各结点插入到链表的前端
算法描述:
void CreateList_H(LinkList &L,int n){
L=new LNode;
L->next = NULL;//先建立一个带头结点的单链表
for(i=n;i>0;--i){
p=new LNode;//生成新结点p=(LNode*)malloc(sizeof(LNode));
cin >> p->data;//输入元素值scanf(&p-> data);
L->next = p;//插入到表头
}
建立单链表:尾插法一 元素插入在链表尾部
1.从一一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点。
2.初始时,r同L均指向头结点。每读入-一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点。
算法描述:
//正位序输入n个元素的值,建立带表头结点的单链表L
void CreateList_R(Link &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指向新的尾结点
}
}//CreateList R