您的位置:首页 > 理论基础 > 数据结构算法

数据结构基础之单链表

2020-07-14 04:50 47 查看

单链表的结构

//带头结点的单链表
typedef int elementType;
typedef struct slNode{
elementType data;
struct slNode *next;
}node;

单链表的初始化

//初始化链表
void initialList(node *&L){
L = new node;
L->next = NULL;
}

求单链表的长度

//求链表长度的实现
int listLength(node *L){
int len = 0;//注意这里的len的初始值为0
node *p;
p = L->next;

while (p){
len++;
p = p->next;
}

return len;
}

按序号取元素的结点的实现

node* getElement(node*& L, int i){
int j = 1;
node* p = L->next;

while (j!=i && p!=NULL){
p = p->next;
j++;
}

return p;//返回结果
//这里包括两种情况:
//1、p!=NULL,即i没有超出范围,返回结点的位置
//2、p==NULL, 可能此时j==i或者j!=i, 都超过了范围,返回NULL
//正好都可以用p来表示,所以用只要返回p即可
}

按值查询元素的实现

node* listLocate(node*& L, elementType x){
node* p = L->next;

while (p->data != x && p != NULL){
p = p->next;
}
return p;//返回结果
//这里也有两种情况:
//1、p == NULL, 即表中没有所查找的元素
//2、p != NULL, 即表中有所查找的元素
//正好都可以用p来表示,所以用只要返回p即可
}

插入算法的实现

bool listInsert(node*& L, int i, elementType x){
int j = 0;
node* p, *s;
p = L;

//找到要插入位置的前一个结点
while (j!=i-1 && p != NULL){
j++;
p = p->next;
}

if (p == NULL){
return false; //序号超出范围
}
else{
s = new node;
s->data = x;
s->next = p->next;
p->next = s;

return true;
}
}

删除算法的实现

bool listDelete(node *&L, int i, elementType &x){
node*p, *s;
int j;
p = L;
j = 0;

while (j!=i-1 && p->next != NULL){
j++;
p = p->next;
}

if (p->next == NULL){
return false;
}
else{
u = p->next;
x = u->data;
p = p->next;

delete u;
return true;
}
}

单链表的构建

//尾插法
//结束符控制创建结束
void createList(node *&L){
node *p, *u;
elementType x;

p = L;
cout << "输入结点元素(输入9999退出)" << endl;
cin >> x;

while (x != 9999){
u = new node;
u->data = x;
u->next = NULL;
p->next = u;

p = u;
cin >> x;
}
}

//结点个数控制创建结束
void createList(node*& L){
int i = 0, n;
node *p, *u;
elementType x;

cout << "输入元素的个数" << endl;
cin >> n;

cout << "输入元素: " << endl;
cin >> x;
while (i < n){
u = new node;
u->data = x;
u->next = NULL;
p->next = u;

p = u;
cin >> x;
}
}

//头插法
//结束符控制创建结束
void createList(node*& L){

node *p, *u;
elementType x;

p = L;
cout << "输入结点元素(输入9999退出)" << endl;
cin >> x;

while (x != 9999){
u = new node;
u->data = x;
u = L->next;
L->next = u;

cin >> x;
}
}

//结点个数控制创建结束
void createList(node*& L){

int i = 0, n;
node *p, *u;
elementType x;

cout << "输入元素的个数" << endl;
cin >> n;

cout << "输入元素: " << endl;
cin >> x;
while (i < n){
u = new node;
u->data = x;
u = L->next;
L->next = u;

cin >> x;
}
}

单链表的销毁

void destroyList(node* & L)
{
node *p,*pTemp;
p=L;
while(p)
{
pTemp=p->next;
delete(p);
p=pTemp;
}
L=NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: