单链表完整算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 包含头文件
#include
#include
#include
// 为结点数据类型和结构体类型起别名
typedefint datatype;
typedefstructLinkNode
{
datatype data; // 数据域
structLinkNode *next; // 指针域存放下一个结点的地址}LNode,*LinkList;
LinkList L; // 单链表的头指针
// 1.用头插法创建单链表
LinkListCreateListHead(int n)
{
// 创建头结点
LNode *L = (LNode *)malloc(sizeof(LNode));
L->next = NULL; // 设置指针域为空
LinkList p; // p指向新结点
for(inti=n;i>0;i--) // 先插入最后一个结点,插入次序与逻辑次序相反
{
// 生成新结点
p = (LNode *)malloc(sizeof(LNode));
// 从键盘输入新结点的值
printf("请输入要插入第%d结点的值:\n",i);
scanf("%d", &p->data);
p->next = L->next; // 让L原来的后继结点成为p的后继结点
L->next = p; // p成为L新的后继结点
}
return L; // 返回单链表的头指针
}
// 2.用尾插法创建单链表
LinkListCreateListTail(int n)
{
// 生成头结点
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;// 设置指针域为空
// p指向新结点,q指向尾结点
LinkList p, q = L;
// 依次在末尾插入n个结点
for(inti=1;i<=n;i++)
{
// 生成新结点p
p = (LNode *)malloc(sizeof(LNode));
// 从键盘输入新结点的值
printf("请输入第%d个结点的值:\n", i);
scanf("%d",&p->data);
p ->next = NULL; // 新结点(也是尾结点)的指针域为空
// 把新结点链接到单链表的末尾
q->next = p;
// 让q指向新的尾结点
q = p;
}
return L;// 返回单链表的头指针
}
// 3.显示单链表中的元素值
voidShowList(LinkList L)
{
if(L == NULL || L->next==NULL)
{
printf("单链表为空。\n");
return;
}
LinkList p = L; // 指针p首先指向头结点
while(p->next!=NULL) // 当指针p没有到达尾结点时{
p = p->next; // 指针后移一个结点
printf("%d\n",p->data); // 输出结点数据域的值}
}
// 4.求单链表的长度(结点的个数)
intGetLength (LinkList L){
LNode *p=L; /*p 先指向头结点*/
int n=0; //n代表除头结点外的结点个数
while(p->next != NULL){// 当指针p没有到达尾结点时p=p->next; //指针后挪一个结点
n++; //结点个数+1
}
return n; //返回结点的个数
}
// 5.按序号查找:在单链表中查找第i个结点LinkListLocateElemByIndex(LinkList L, inti)
{
LinkList p = L; // 指针p先指向头结点,负责后移int j = 0; // j用来计算到达结点的序号
if(L==NULL || L->next==NULL) {
printf("单链表为空。\n");
return NULL;
}
// p指针后移的条件:p不是尾结点,而且j
while(p->next!=NULL && j
{
p = p->next; // p指针后移
j++; // j递增
}
if(j==i) // 找到第i个结点时:j==i
{
return p; // 返回第i个结点的地址}else{
return NULL; // 第i个结点不存在,返回NULL }
}
// 6.按值查找:在单链表中查找值为e的结点LinkListLocateElemByData(LinkList L, datatype e)
{
LinkList p = L; //指针p先指向头结点,负责后移
if(L==NULL || L->next==NULL) {
printf("单链表为空。\n");
return NULL;
}
// p指针后移的条件:p不是尾结点,而且p->data!=e while(p->next!=NULL && p->data!=e)
{
p = p->next; // p指针后移
}
// 找到值为e的结点
if(p->data == e)
{
return p; // 返回结点的地址
}else{
return NULL; // 结点不存在,返回NULL }
}