数据结构算法之单链表的原理及其实现
链表是一种顺序表的链式存储结构,什么是链式存储结构,就是像自行车的链条一样把数据连接起来,这里并不是指的是物理地址相邻。而是通过指针寄存地址的方式将一串串地址串成链条的形式。
链表的优势:相对于顺序表进行插入或者删除操作时要进行大量的移动的工作增大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;
}
}
码片