数据结构学习日记(三)

数据结构学习日记(三)

 

 类型定义:

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

 

数据结构学习日记(三)

上一篇:记一次简单的注入


下一篇:Markdown使用-生成目录树