データ構造アルゴリズムの単一リンクリストの原理と実現
リンクリストは、シーケンシャルテーブルのチェーンストレージ構造です。チェーンストレージ構造とは、自転車のチェーンのようにデータを接続することです。これは、物理アドレスが隣接していることを意味するものではありません。代わりに、一連のアドレスは、アドレスを登録するためのポインターを介してチェーンにストリング化されます。
リンクリストの利点:シーケンステーブルと比較して、大量の移動作業によりCPUのオーバーヘッドが増加します。リンクリストはアドレス転送操作を実行するだけで済みます。この効率は、シーケンステーブルよりも明らかに高くなります。
一般的な学習は、単一リンクリストから始まります。リンクリスト
のヘッドとしてポインタヘッドが使用され、複数のヘッドがデータ領域に接続されます。
/ **
1.初期化
2、
前に挿入3、後に挿入
4、任意の位置
に5を挿入、要素
7を取得、要素
6を検索、
7を削除、トラバース
8、破棄
*** ///
//シングルネックレスウォッチ
#include<stdio.h>
#include<Windows.h>
#include<iostream>
using namespace std;
typedef int Elemdata;
typedef struct _LinkList{
Elemdata data;
_LinkList *next;
}List,Node;
//1、单链表初始化
bool initlist(List *&L){
L = new List;
if(!L) return false;
L->next=NULL;
return true;
}
//2、单链表前插法
bool insert_front(List *&L,Node *node ){
//为什么这里只用传一个一级指针,一级指针不是只是只能值得传入不能将值带出的吗
if(!L||!node)return false;
node->next = L->next;
L->next=node;
return true;
}
//3、单链表尾插法
bool insert_end(List *&L,Node *node){
if(!L||!node)return false;
//找到最后一个结点
Node *last = L;
while(last->next){
last=last->next;
}
node->next=NULL;
last->next=node;
return true;
}
//4、单链表任意位置插入
bool insert_pos(List *&L,int i,Elemdata &e){
if(!L) return false;
int j=0;
List *p = L;
Node *s;
//找到第i个结点的前一个元素
while(p&&j<(i-1)){
p=p->next;
j++;
}
if(!p->next||j!=(i-1)) return false;
//找到前一个元素
s = new Node;
s->data=e;
s->next = p->next;
p->next = s;
return true;
}
//5、查找结点为i的元素
bool getElemdata(List *L,int i,Elemdata &e){
if(!L)return false;
List *p = L;
int j = 0;
while(j<i&&p){
p=p->next;
j++;
}
if(j!=i&&p) return false;
e=p->data;
return true;
}
//6、判断元素e是否存在
bool isExitElemdate(List *L,Elemdata &e){
if(!L)return false;
int j=0;
List *p=L->next;
while(p&&p->data!=e){
p=p->next;
j++;
}
if(!p)return false;
return true;
}
//7、遍历链表
void initPrint(List *&L){
if(!L)return;
List *p = L->next;
while(p){
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
//8、删除某个位置的结点
bool List_delete(List *&L,int i){
if(!L) return false;
int j=0;
//找到要删除结点的前一个结点
List *p = L;
while(p->next&&j<(i-1)){
p=p->next;
j++;
}
if(!p->next||j!=i-1) return false;
Node *d,*q;
d = p; //i的前一个结点
q = p->next;//要删除的结点
d->next = q->next;
delete q;
return true;
}
//9、销毁单链表
void List_destoyed(List *&L){
if(!L) return ;
List *p = L;
Node *q;
while(p){
q = p;
p=p->next;
cout<<"销毁结点元素"<<q->data<<endl;
delete q;
}
}
码片