一、头插法新建链表
1、先让新结点指向头结点所指向的结点
2、再让头结点指向新结点
//头插法新建链表
void head_insert_list(Linklist &L) //Linlilist 与Lnode*等价
{
Elemtype e;
scanf("%d", &e);
Linklist s; //s指针用来记录新申请的结点
while(e!=9999)
{
s = (Linklist)malloc(sizeof(Lnode)); //申请新空间 用s指向它
s->data = e;
s->next = L->next;
L->next = s;
scanf("%d", &e);
}
}
二、尾插法新建链表
1、让当前链表的尾结点指向新申请的结点
2、r
用来指向当前链表的尾结点,所以每插入一个新结点,都要后移r
指针
3、最后让尾结点的指针域为NULL
//尾插法新建链表
void tail_insert_list(Linklist &L)
{
Elemtype e;
scanf("%d", &e);
Lnode *s, *r=L; //s指针用来记录新申请的结点 r用来始终指向尾结点
while(e!=9999)
{
s = (Linklist)malloc(sizeof(Lnode));
s->data = e;
r->next = s;
r = s; //更新r指针到当前链表的尾结点
scanf("%d", &e);
}
s->next = NULL; //最后一个结点的指针域为空
}
三、按位置查询
1、判断查询位置是否合理
2、移动指针至要查询的位置
3、i
用来记录指针的位置
//按位置查询
Linklist search_bylocation(Linklist L, int pos)
{
int i=0; //i用来记录指针的位置
if(pos<0) //如果查询的位置不合理
{
return NULL;
}
while(L&&i<pos) //L不为空
{
L=L->next; //L指针向后移动
i++;
}
return L;
}
四、按值查询
1、i
用来记录指针的位置
2、指针遍历链表,判断指针所指向结点的数据是否符合条件
3、若不符合条件,指针后移
//按值查询
int search_byvalue(Linklist L, Elemtype val)
{
int i=0; //用i来记录指针的位置
while(L) //L结点不是NULL
{
if(L->data==val)
{
return i;
}
L = L->next;
i++;
}
return -1;
}
五、单链表的删除
1、用指针接收要删除的结点的前一个结点
2、拿到要删除的结点
3、把要删除的结点的后一个结点赋值给要删除的结点的前一个结点
4、释放删除的结点空间
bool delete_list(Linklist L, int pos)
{
Linklist p = search_bylocation_list(L, pos-1); //拿到要删除结点的前一个结点
if(p==NULL)
{
return false;
}
Linklist q = p->next; //拿到要删除的结点指针
p->next = q->next;
free(q);
return true;
}
六、完整代码
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data; //数据域
struct Lnode *next; //指针域
}Lnode, *Linklist;
//头插法新建链表
void head_insert_list(Linklist &L) //Linlilist 与Lnode*等价
{
Elemtype e;
scanf("%d", &e);
Linklist s; //s指针用来记录新申请的结点
while(e!=9999)
{
s = (Linklist)malloc(sizeof(Lnode)); //申请新空间 用s指向它
s->data = e;
s->next = L->next;
L->next = s;
scanf("%d", &e);
}
}
//尾插法新建链表
void tail_insert_list(Linklist &L)
{
Elemtype e;
scanf("%d", &e);
Lnode *s, *r=L; //s指针用来记录新申请的结点 r用来始终指向尾结点
while(e!=9999)
{
s = (Linklist)malloc(sizeof(Lnode));
s->data = e;
r->next = s;
r = s; //更新r指针到当前链表的尾结点
scanf("%d", &e);
}
s->next = NULL; //最后一个结点的指针域为空
}
//按位置查询
Linklist search_bylocation(Linklist L, int pos)
{
int i=0; //i用来记录指针的位置
if(pos<0) //如果查询的位置不合理
{
return NULL;
}
while(L&&i<pos) //L不为空
{
L=L->next; //L指针向后移动
i++; //i
}
return L;
}
//按值查询
int search_byvalue(Linklist L, Elemtype val)
{
int i=0; //用i来记录指针的位置
while(L) //L结点不是NULL
{
if(L->data==val)
{
return i;
}
L = L->next;
i++;
}
return -1;
}
//单链表的删除
bool delete_list(Linklist L, int pos)
{
Linklist p = search_bylocation_list(L, pos-1); //拿到要删除结点的前一个结点
if(p==NULL)
{
return false;
}
Linklist q = p->next; //拿到要删除的结点指针
p->next = q->next;
free(q);
return true;
}
//打印单链表
void print(Linklist L)
{
L=L->next; //从第一个结点开始 而不是头结点
while(L!=NULL) //
{
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
int main()
{
Linklist L; //L是链表头指针 是结构体类型
L = (Linklist)malloc(sizeof(Lnode)); //申请头结点空间 头指针指向它
L->next = NULL; //头结点的指针暂时为空
head_insert_list(L); //头插法新建链表
print(L);
tail_insert_list(L); //尾插法新建链表
print(L);
Elemtype ret; //用来接收函数的返回值
ret = search_bylocation(L, 4); //查找第四位的元素是谁
printf("%d\n",ret);
Linklist i = search_byvalue(L, 6); //查找值为6的元素值的位置
delete_list(L, 4);
print(L);
return 0;
}