深度解析单向链表

数据结构

typedef struct{
  elemType data;//结点数据域
  struct LNode* next;//结点指针域
}LNode,*linkList;

头文件 head.h

#include<iostream>
#define MAXSIZE 100  //最大表长100
//#define OK 1
//#define ERROR 0
//为使读者更易理解,一下代码不采用宏定义的OK,ERROR
using namespace std;

typedef int status;  //int实型
typedef int elemType;//int实型

一、初始化

(1)生成新节点作为头结点,用头指针L直线头结点

(2)头结点指针域置空

代码实现

status init_List(linkList &L){
  L=new LNode;
  L->next=NULL;
  return 1;
}

二、单链表取值

(1)用指针p指向首元结点,用j作为计数器并赋值为1

(2)从首元结点开始依次顺着链域next向下访问,只要指针p不为空(NULL),并且没有达到序号为i的节点,可以执行以下操作:

          p指向下一个节点

          计数器+1

代码实现

status get_Elem(linkList L,int i,elemType &e){
   LNode* p;
   p=L->next;
   j=1;
   while(p&&j<1){
      p=p->next;
      ++j;
   }
   if(!p||j>1)
      return 0;
   e=p->data;
   return 1;
}

三、查找

(1)用指针p指向首元结点

(2)从首元结点开始依次顺着链域next向下访问,只要指针p不为空(NULL),并且p指向的节点的数据域不为e值,可以执行以下操作:

          p指向下一个节点

(3)返回p。若查找成功,p为该节点的地址,若失败,p=NULL

代码实现

LNode* locate_List(linkList L,elemType e){
   LNode* p;
   p=L->next;
   while(p&&p->data!=e)
      p=p->next;
   return p;
}

四、删除

(1)查找节点Xi-1,用指针p指向该节点

(2)临时保存要删除节点ai的地址在e里

(3)将节点*p的指针域指向Xi-1的后继节点

(4)释放节点ai空间

代码实现

status delete_List(linkList &L,int i){
   LNode* p=L;
   int j=0;
   while(p->next && j<i-1){
      p=p->next;
      ++j;
   }
   if(!p->next||j>i-1)
      return 0;
   linkList q;
   p->next=q->next;
   delete q;
   return 1;
}

附加:插入之前插法

(1)创建只有一个头结点的空的单链表

(2)确定元素个数,假设为n,则循环n次执行下面的操作

         生成节点*p;

         输入*p的数据域;

         将新的节点*p插入到头结点的后面;

时间复杂度O(n)

代码实现

void create_List_Head(linkList &L,int n){
   L=new LNode;
   LNode* p;
   L->next=NULL;
   for (int i=0;i<n;i++){
      p=new LNode;
      cout<<"Please insert elem "<<i<<endl;
      cin>>p->data;
      p->next=L->next;
      L->next=p;//新节点插入头结点后面
   }
}

插入之后插法

(1)创建只有一个头结点的空的单链表

(2)初始化尾指针tail 并指向头结点

(3)确定插入元素个数,假设为n,则循环n次执行下面的操作

         生成节点*p;

         输入*p的数据域;

         将新节点*p插入到尾结点*tail后面

         尾指针tail指向新的尾结点*p;

代码实现

void create_List_Tail(linkList &L,int n){
   L=new LNode;
   L->next=NULL;
   LNode* tail=L;
   for (int i=0;i<n;i++){
      p=new LNode;
      cout<<"Please insert elem "<<i<<endl;
      cin>>p->data;
      p->next=NULL;
      tail->next=p;
      tail=p;
   }
}

 

上一篇:数据结构学习——线性表


下一篇:拆分线性表(21.6.1)