这里写目录标题
数据结构定义
typedef struct Lnode{
elemtype data;
struct Lnode* next;
}Lnode,*Linklist;
初始化头结点
bool initlinklist(Linklist &l)
{
l=(Lnode*)malloc(sizeof(Lnode));
l->next=NULL;
return true;
}
判断链表是否为空
bool listempty(Linklist &l)
{
if(l->next==NULL)
return true;
else
return false;
}
带头结点的按位序插入
bool listinsert(Linklist &l,elemtype e,int i)
{
if(i<1)
{
return false;
}
Lnode*p=l;///指向当前扫描节点
int j=0;///指向第几个
while(p!=NULL && j<i-1) ///找到第i-1个节点
{
p=p->next;
j++;
}
if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
/*j=n-1跳出*/
Lnode *s=(Lnode*)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
头插法
Linklist list_headinsert(Linklist &l)
{
elemtype x;
cin>>x;
while(x!=0)
{
Lnode* s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
s->next=l->next;
l->next=s;
cin>>x;
}
return l;
}
尾插法
Linklist list_tailinsert(Linklist &l)
{
elemtype x;
cin>>x;
Linklist p=l;///指向最后一个节点
while(x!=0)
{
Lnode *s =(Lnode*)malloc(sizeof(Lnode));
s->data=x;
p->next=s;
p=s;
cin>>x;
}
p->next=NULL;///表尾设置为NULL
return l;
}
按值查找,返回节点
Lnode *locateelem(Linklist l,elemtype e)
{
Linklist p=l->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
按位查找,返回节点
Lnode *getelem(Linklist l,int i)
{
if(i==0) return l;
int j=1;///计数
Linklist p=l->next;
if(i<1) return NULL;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
return p;
}
将新节点插入到第i个位置
借助前面的按位查找函数
Linklist insertlist(Linklist &l,int i,elemtype e)
{
Lnode *s=(Lnode*)malloc(sizeof(Lnode));
s->data=e;
s->next=NULL;
Linklist p=getelem(l,i-1);
s->next=p->next;
p->next=s;
}
删除第i个节点
Linklist deletenode(Linklist &l,int i)
{
Linklist p=getelem(l,i-1);///删除节点的前驱节点
Linklist q=p->next;///q指向删除节点
p->next=q->next;
free(q);
}
遍历输出
bool output(Linklist l)
{
Linklist p=l->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
return true;
}
求链表长度
int listlen(Linklist l)
{
Linklist p=l->next;
int sum=0;
while(p!=NULL)
{
p=p->next;
sum++;
}
return sum;
}
主函数测试各个功能
int main()
{
Linklist l;
Linklist l2;
initlinklist(l);///初始化表头
initlinklist(l2);///初始化表头
cout<<"*****表是否为空******"<<endl;
cout<<listempty(l)<<endl;
cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
l=list_headinsert(l);///头插法,输入0结束
output(l);
cout<<"*****在第1个位置插入55******"<<endl;
listinsert(l,55,1);
output(l);
cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
l2=list_tailinsert(l2);///尾插法,输入0结束
output(l2);
cout<<"*****求l的表长******"<<endl;
cout<<listlen(l)<<endl;/*求表长*/
cout<<"*****按值查找5,输出查找结果******"<<endl;
Lnode *p=locateelem(l,5);
cout<<p->data<<endl;
cout<<"*****将10插到第四个位置******"<<endl;
insertlist(l,4,10);
output(l);
cout<<"*****删除第五个节点******"<<endl;
deletenode(l,5);
output(l);
return 0;
}
测试结果:
完整代码
#include<bits/stdc++.h>
#include<iostream>
#define elemtype int
using namespace std;
typedef struct Lnode{
elemtype data;
struct Lnode* next;
}Lnode,*Linklist;
/*初始化头结点*/
bool initlinklist(Linklist &l)
{
l=(Lnode*)malloc(sizeof(Lnode));
l->next=NULL;
return true;
}
/*判断链表是否为空*/
bool listempty(Linklist &l)
{
if(l->next==NULL)
return true;
else
return false;
}
/*带头结点按位序插入*/
bool listinsert(Linklist &l,elemtype e,int i)
{
if(i<1)
{
return false;
}
Lnode*p=l;///指向当前扫描节点
int j=0;///指向第几个
while(p!=NULL && j<i-1) ///找到第i-1个节点
{
p=p->next;
j++;
}
if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
/*j=n-1跳出*/
Lnode *s=(Lnode*)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
/*头插法*/
Linklist list_headinsert(Linklist &l)
{
elemtype x;
cin>>x;
while(x!=0)
{
Lnode* s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
s->next=l->next;
l->next=s;
cin>>x;
}
return l;
}
/*尾插法*/
Linklist list_tailinsert(Linklist &l)
{
elemtype x;
cin>>x;
Linklist p=l;///指向最后一个节点
while(x!=0)
{
Lnode *s =(Lnode*)malloc(sizeof(Lnode));
s->data=x;
p->next=s;
p=s;
cin>>x;
}
p->next=NULL;///表尾设置为NULL
return l;
}
/*按值查找*/
Lnode *locateelem(Linklist l,elemtype e)
{
Linklist p=l->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
/*按位查找*/
Lnode *getelem(Linklist l,int i)
{
if(i==0) return l;
int j=1;///计数
Linklist p=l->next;
if(i<1) return NULL;
while(j<i&&p!=NULL)
{
p=p->next;
j++;
}
return p;
}
/*将新节点插入到第i个位置*/
Linklist insertlist(Linklist &l,int i,elemtype e)
{
Lnode *s=(Lnode*)malloc(sizeof(Lnode));
s->data=e;
s->next=NULL;
Linklist p=getelem(l,i-1);
s->next=p->next;
p->next=s;
}
/*删除第i个节点*/
Linklist deletenode(Linklist &l,int i)
{
Linklist p=getelem(l,i-1);///删除节点的前驱节点
Linklist q=p->next;///q指向删除节点
p->next=q->next;
free(q);
}
/*遍历输出*/
bool output(Linklist l)
{
Linklist p=l->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
return true;
}
/*求链表的长度*/
int listlen(Linklist l)
{
Linklist p=l->next;
int sum=0;
while(p!=NULL)
{
p=p->next;
sum++;
}
return sum;
}
int main()
{
Linklist l;
Linklist l2;
initlinklist(l);///初始化表头
initlinklist(l2);///初始化表头
cout<<"*****表是否为空******"<<endl;
cout<<listempty(l)<<endl;
cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
l=list_headinsert(l);///头插法,输入0结束
output(l);
cout<<"*****在第1个位置插入55******"<<endl;
listinsert(l,55,1);
output(l);
cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
l2=list_tailinsert(l2);///尾插法,输入0结束
output(l2);
cout<<"*****求l的表长******"<<endl;
cout<<listlen(l)<<endl;/*求表长*/
cout<<"*****按值查找5,输出查找结果******"<<endl;
Lnode *p=locateelem(l,5);
cout<<p->data<<endl;
cout<<"*****将10插到第四个位置******"<<endl;
insertlist(l,4,10);
output(l);
cout<<"*****删除第五个节点******"<<endl;
deletenode(l,5);
output(l);
return 0;
}