单聊表
每个节点包含两个域:数据域和指针域。数据域存储数据元素,指针域存储下一个节点的地址,因此指针指向的类型也是节点类型。每个指针都指向下一个节点,都是朝一个方向的,这样的链表称为单向链表或单链表。
bool InitList_L(LinkList &L){L = new LNode;if(!L)return false; // 生成节点失败L->next = NULL; // 头部指针域置空return true;}
void CreateList_H(LinkList &L){int n;LinkList s;L = new LNode;L->next = NULL; // 建立空链表cout<<"输入元素个数n"<<end;cin>>n;cout<<"输入n个元素"<<end;while(n--){s = new LNode;cin>>s->data;s->next = L->next;L->next = s;}}
void CreateList_R(LinkList &L){int n;LinkList s, r;L = new LNode;L->next = NULL; // 建立空链表r = L; // 尾指针指向头节点cout<<"输入元素个数n"<<end;cin>>n;cout<<"输入n个元素"<<end;while(n--){s = new LNode; // 生成新节点cin>>s->data; // 输入元素赋值给新节点数据域s->next = NULL;r->next = s; // 新节点插入尾节点之后r = s; // r 指向新尾节点 s}}
修改指针顺序为:先修改没有指针标记的那一端。若两端都有标记则可随意
bool getElement(LinkList L,int i,int &e){int j;LinkList p;p = L->next;j = 1;while(j < i && p){p = p->next; // 指针向后移j++; // 计数器 +1}if(!p || j>i) // 检测是否超出范围return false;e = p->data; // 取第 i 个节点的数据域return true;}
bool LocateElement(LinkList l,int e){LinkList p;p = L->next;while(p && p->data != e){p = p->next;}if(!p)return false;return true;}
bool ListInsert_L(LinkList &L,int i,int e){int j;LinkList p , s;p = L;j = 0;while(p && j < i - 1){p = p -> next;j++;}if(!p || j > i - 1)return false;s = new LNode; // 生成新节点s->data = e; // 将数据元素e 插入新节点的数据域s->next = p->next; // 将新节点的指针域 指向 第 i 个节点p->next = s; // 节点 p 指向 节点 sreturn true;}
bool ListDelete_L(LinkList &L,int i){LinkList q , p;int j;p = L;j = 0;while((p->next)&&(j < i - 1)){p = p -> next;j++;}if(!(p-> next) && (j > i - 1))return false;q = p->next; // 临时保存要被删除的节点地址p->next = q->next; // 将 q 节点的下一个节点的地址赋给 p 的指针域delete q; // 删除节点,释放空间return true;}
双向链表
单链表只能向后操作,不可以向前操作。为了向前、向后操作方便,可以给每个元素附加两个指针域,一个存储前一个元素的地址,另一个存储下一个元素的地址。
bool InitList_L(DuLinkList &L){L = new DuLNode; // 生成新节点if(!L)return false;L->prior = L->next = NULL; // 头节点的两个指针域置空return true;}
void CreateDuList_H(DuLinkList &L){int n;DuLinkList s;L = new DuLNode;L->prior = L->next = NULL;cout<<"请输入元素个数n:"<<endl;cin>>n;cout<<"输入n 个 元素"<<endl;while(n--){s = new DuLNode; // 生成新节点 scin>>s->data; // 输入元素值赋值给 新节点的 数据域if(L->next)L->next->prior = s;// 将 s 插入 头节点之后s->next = L->next;s->prior = L;L->next = s;}}
bool ListInsert_L(DuLinkList &L, int i ,int &e){int j;DuLinkList p , s;p = L;j = 0;while(p && j < i){p = p->next;j++;}if(!p || j > i)return false;s = new DUlNode;s->data = e;p->prior->next = s;s->prior = p->prior;s->next = p;p->prior = s;return true;}
bool ListDelete_L(DuLinkList &L,int i){DuLinkList p;int j;p = L;j = 0;while(p && (j < i)){p = p -> next;j++;}if(!p || (j > i))return false;if(p->next) // 如果有后续节点p->next->prior = p ->prior; //将 p 节点的后续节点的前驱指针域,指向 p 节点的前一个节点p->prior->next = p ->next; // 将 p 节点的前一个节点的后继指针域,指向 p 的节点的下一个节点delete p;return true;}
循环链表
单链表中,只能向后,不能向前。如果从当前节点开始,无法访问该节点前面的节点,而最后一个节点的指针指向头节点,形成一个环,就可以从任何一个节点出发,访问所有的节点,这就是循环链表。循环链表和普通链表的区别就是最后一个节点的后继指向了头节点。
