单链表的定义
data 存放数据域,next为指针域
带有头结点的单链表
单链表的基本操作
1.采用头插法建立单链表
2.采用尾插法建立单链表
3.插入结点操作
4.删除结点操作
C++代码实现
#include <iostream>
#include <cstdlib>
using namespace std;
//数据类型
typedef struct{
int x;
}ElemType;
//结点结构体
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表类
class Link_List{
public:
//初始化
Link_List(){
cout<<"初始化完成"<<endl;
L = new LNode;
L->next=NULL;
}
//头插法
void Head_Insert()
{
LNode *s;//插入的结点指针
ElemType e;
while(true){
cin>>e.x;
if(e.x==0)
break;
s = new LNode;
s->data = e;
s->next=L->next;
L->next=s;
}
}
//尾插法
void Tail_Insert()
{
//*s插入结点指针,r尾指针
LNode *s,*r=L;
ElemType e;
while(true){
cin>>e.x;
if(e.x==0)
break;
s = new LNode;
s->data = e;
r->next = s;
r = s;
}
r->next = NULL;
}
//遍历
void Show(){
LNode *t;
t = L->next;
while(t!=NULL){
int n = t->data.x;
cout<<n<<" ";
t = t->next;
}
cout<<endl<<"=========================="<<endl;
}
//按序号查找返回当前位置的指针
LNode *GetElem(int i){
int j=1;
LNode *p = L->next;
if(i==0){
return L;
}
if(i<1){
return NULL;
}
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//删除结点操作
void DeleteNode(int loc){
LNode *p = GetElem(loc-1);
LNode *q = p->next;
p->next = q->next;
delete q;
}
//插入结点操作
void Insert_Node(int loc){
LNode *p = GetElem(loc-1);
LNode *s = new LNode;
cout<<"请输入元素的值"<<endl<<">>";
cin>>s->data.x;
s->next = p->next;
p->next=s;
}
//求链表长度
void GetLength(){
int n=0;
LNode *p = L->next;
while(p){
p=p->next;
n++;
}
cout<<n<<endl;
}
//功能选择
void Choice(int c){
int loc;
switch(c){
case '1':
cout<<"头插法建立链表"<<endl;
Head_Insert();
break;
case '2':
cout<<"尾插法建立链表"<<endl;
Tail_Insert();
break;
case '3':
cout<<"插入结点操作"<<endl;
cout<<"请输入插入位置"<<endl<<">>";
cin>>loc;
Insert_Node(loc);
break;
case '4':
cout<<"删除结点操作"<<endl;
cout<<"请输入删除结点的位置"<<endl;
cin>>loc;
DeleteNode(loc);
break;
case '5':
cout<<"链表的长度"<<endl;
GetLength();
break;
case '0':
cout<<"显示链表"<<endl;
Show();
break;
default:
cout<<"退出程序"<<endl;
exit(0);
break;
}
}
private:
LinkList L;//链表
};
int main()
{
Link_List L;
char c;
while(true){
cout<<"请输入功能"<<endl<<">>";
cin>>c;
L.Choice(c);
}
return 0;
}
运行结果: