一.定义结点
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*Linklist;
定义了当前结点的数据和下一个结点的地址
二.链表初始化
bool initlist(Linklist &L)//初始化
{
L=(Lnode*)malloc(sizeof(Lnode));
if(L==NULL)
return false;
L->next=NULL;
return true;
}
L为链表头结点,先为其申请一片内存,再使其指向NULL
三.插入结点
bool listinsert(Linklist &L,int i,int e)//插入
{
if(i<1)
return false;
Lnode *p;
int j=0;
p=L;
if(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
{
return false;
}
Lnode*s=(Lnode*)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
先判断i的值是否合法,再定义一个指针p指向头结点,使p不断向后遍历找到第i-1个结点,之后申请一个新结点,改变位置关系即可。
四.删除结点
bool Listdeldte(Linklist &L,int i,int &e)//删除
{
if(i<1)
return false;
Lnode *p;
int j=0;
p=L;
while (p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return false;
if(p->next==NULL)
return false;
Lnode *q=p->next;
e=q->data;
p->next=q->next;
free(q);
return true;
}
前面同插入结点找到低i-1个结点,改变结点之间的位置关系并释放内存
五.按位查找
Lnode *get(Linklist L,int i)//按位查找
{
if(i<1)
return false;
Lnode *p;
int j=0;
p=L;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
return p;
}
六.尾插法
Linklist listcreate1(Linklist &L)//尾插法
{
int x;
L=(Linklist)malloc(sizeof(Lnode));
Lnode *s,*r=L;
scanf("%d",&x);
while(x!=9999)
{
s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
r->next=NULL;
return L;
}
}
七.头插法
Linklist listcreate2(Linklist &L){
Lnode *s;
int x;
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999)
{
s=(Lnode*)malloc(sizeof(Lnode));
s->data=x;
s->next=L->next;
L->next=s;
}
scanf("%d",&x);
return L;
}