单链表:是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(存放的数据元素)+指针(指示下一个元素存储位置,单、双链表的最后一个节点除外,它们存储的是一个空指针NULL),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
节点的结构如下:
节点定义:
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
最开始的那个节点是头节点,头节点的数据域是不存放数据的,指针域指向链表的第一个节点。在单链表的定义中,带有头节点的称为带头节点单链表,不带头节点的称为不带头节点单链表。我们这次介绍的就是带头节点单链表。
具体代码如下:
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &l){
// l = (LNode *)malloc(sizeof(LNode ));
l = new LNode;
if(l == NULL) cout<<"空间分配失败"<<endl;
else{
l->next = NULL;
cout<<"初始化成功"<<endl;
}
}
// 查找的i个位置的元素并返回元素值
void GetElem(LinkList l,int i,int &e){
LNode *p;
p = new LNode;
p=l;
int j=0;
while(p && j < i){ //找到第i个节点
p = p->next;
j++;
}
if(p == NULL|| j>i) cout<<"位置不合法"<<endl;
else{
e = p->data;
cout<<"获取成功."<<endl;
}
}
// 查找表中第一个与e值相等的元素并返回其节点所在地址
LNode *locateElem(LinkList l,int e){
LNode *p;
p = new LNode;
p=l->next;
while(p && p->data != e){
p = p->next;
}
return p;
}
//插入(在第i个位置插入元素e)
void LinkListInsert(LinkList &l,int i,int e){
LNode *p;
p = new LNode;
p=l;
int j=0;
while(p && j < i-1){ //找到i的前驱
p = p->next;
j++;
}
if(p == NULL) cout<<"位置不合法"<<endl;
else{
LNode *s;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
cout<<"插入完成"<<endl;
}
}
//删除(删除第i个位置的元素)
void LinkListDelete(LinkList &l,int i){
LNode *p;
p = new LNode;
p=l;
int j=0;
while(p && j<i-1){ //找到i的前驱节点
p = p->next;
j++;
}
if(p == NULL) cout<<"删除位置不合法."<<endl;
else{
LNode *s;
s = new LNode;
s = p->next;
p->next = p->next->next;
delete s;
}
}
//头插法建立单链表 逆序输入链表的元素
void CreateLinkList_head(LinkList &l,int n){
cout<<"尾插法,请逆序输入元素的值"<<endl;
for(int i=0;i<n;i++){
cout<<"请输入第"<<n-i<<"个元素: ";
int t;
cin>>t;
LNode *p;
p = new LNode;
p->data = t;
p->next = l->next;
l->next = p;
}
}
//尾插法建立单链表(创建一个指向尾节点的指针)
void CreateLinkList_tail(LinkList &l,int n){
cout<<"尾插法,请顺序输入元素的值"<<endl;
LNode *tail;
tail = new LNode;
tail = l;
for(int i=0;i<n;i++){
cout<<"请输入第"<<i+1<<"个元素: ";
LNode *p;
p = new LNode;
int x;
cin>>x;
p->data = x;
p->next = tail->next;
tail->next = p;
tail = p;
}
}
void show(LinkList l){
LNode *p;
p = l->next;
while(p != NULL){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void test(){
// 头插法建立单链表
// LinkList l;
// InitList(l);
// int n;
// cout<<"请输入元素个数:";
// cin>>n;
//
// CreateLinkList_head(l,n);
// show(l);
// 尾插法建立单链表
LinkList s;
InitList(s);
int m;
cout<<"请输入元素个数:";
cin>>m;
CreateLinkList_tail(s,m);
show(s);
// 删除第i个位置的元素
// LinkListDelete(s,2);
// show(s);
// 在第i个位置插入新元素
// LinkListInsert(s,2,22);
// show(s);
//查找表中第一个与e值相等的元素并返回其节点所在地址
// LNode *t;
// t = new LNode;
// t = locateElem(s,3);
// cout<<"地址:"<<t<<endl;
// cout<<"值:"<<t->data<<endl;
// 查找的i个位置的元素并返回元素值
// int t;
// GetElem(s,3,t);
// cout<<"第3个位置的元素值为:"<<t<<endl;
}
int main(){
test();
return 0;
}