单链表完整算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 }

}

相关文档
最新文档