ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:17.35KB ,
资源ID:9254429      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9254429.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(链表基本操作.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

链表基本操作.docx

1、链表基本操作#include /标准函数输出库#include /包含malloc()函数的函数库#define OK 1 /宏定义OK为1#define ERROR 0 /宏定义ERROR为0struct Node int ele; struct Node* next;/* 顺序表的表示方法*/typedef struct struct Node* pData; int length; LinkedList;/* 顺序表的初始化 */LinkedList* InitList(LinkedList* L) if (NULL=L) L=(LinkedList*)malloc(sizeof(Lin

2、kedList); /如果链表不存在则开辟空间 if(!L) printf(为L申请空间失败!n); /如果申请失败输出提示语 L-pData=(struct Node*)malloc(sizeof(struct Node); /为指针头结点开辟空间 if(!L-pData) printf(为L-pData申请空间失败!n); return NULL; else L-pData-next=NULL; /头结点指向空 L-length=0; /链表长度为0 return L;/* 顺序表的销毁 */int DestroyList(LinkedList* L) int k=1; struct No

3、de *p=L-pData-next, *q=L-pData; for (k=1;klength; k+) free(q); /释放指针q所指向的空间 q=p; /p指针顺序后移 p=q-next; free(q); /释放最后结点的内存 L-pData=NULL; /把链表地址置空 return 1;/* 向第i个位置插入值为x的元素, 在第一个位置插入数据时i为1 */int InsertElem(LinkedList* L, int x, int i) int k=0; struct Node *temp,*head; temp=(struct Node*)malloc(sizeof(s

4、truct Node); /为新插入的结点开辟空间 temp-ele=x; /把要插入的值插入到指定位置 temp-next=NULL; /节点指向的位置为空 head=L-pData; /把链表的头指针赋给head if(!L-pData | i-1L-length) printf(顺序表或是数据位置有问题, 不能插入!); return ERROR; for(k=1; knext; /找到要插入位置 temp-next=head-next; /要插入位置的节点地址赋给temp-next head-next=temp; /把要插入的节点的指针赋给head-next temp=NULL; /把

5、temp置空 L-length+; /链表长度加1 return OK;/* 按位置删除: 删除第i个位置上的元素, 第一个位置用1表示 */int DeleteElem(LinkedList* L, int i) int k=0; struct Node *head, *temp; if(!L-pData | 0=L-length | iL-length) return ERROR; head=L-pData; for (k=1; knext; temp=head-next; /把要删除的位置的地址赋给temp head-next=head-next-next; /把删除位置的地址赋给它节点

6、的指针域 free(temp); /把删除的节点的内存释放 temp=NULL; /置空temp L-length-; /表长度减1 return OK;/*逆转整个顺序表: 即把整个顺序里面的元素的顺序反转过来*/int ReverseList(LinkedList* L) int k=0; struct Node *p, *q; / 结点指针 if (L-lengthpData-next-next; / 指向第2个元素 q=p-next; / q指向第3个元素 L-pData-next-next=NULL; / 将第1个元素的下个指针设为NULL, 成为线性表的最后一个元素 for (k=

7、2; klength-1; k+) / 最后一个元素单独处理 p-next=L-pData-next; L-pData-next=p; p=q; q=p-next; /依次把前一节点的地址赋给后一节点的指针域,后一节点的地址赋给头结点的指针域 p-next=L-pData-next; /把倒数第二个的地址赋给最后一个节点的指针域 L-pData-next=p; /头结点指向最后一个节点 return OK;/* 输出某个数据 */void PrintNode(struct Node x) printf(%d ,x.ele); /输出元素的值/* 输出顺序表中的每个元素 */void Print

8、List(LinkedList* L) int k=0; struct Node* temp=NULL; if(!L-pData | !L) printf(顺序表不存在!n); return; if(0=L-length) printf(顺序表是空的!n); return; printf(表中的元素有:n); temp=L-pData; /把链表的头指针赋给temp for(k=1; klength; k+) temp=temp-next; PrintNode(*temp); printf(n);/* 置空表 */int SetEmpty(LinkedList* L) int k=1; str

9、uct Node *p=L-pData-next-next,*q=L-pData-next; /p指向第2个元素,q指向第1个元素 for (k=2;klength;k+) /依次置空单链表节点 free(q); /释放指针q指向的节点的空间 q=p; /使p指针指向下一节点 p=q-next; /使p指针指向下一节点 free(q); /释放指针q指向的尾节点的空间 L-length=0; L-pData-next=NULL; /置空指向单链表头节点后一节点的指针 return OK; /返回值表示操作成功/* 求表长 */int GetListLength(LinkedList* L)in

10、t GetListLength(LinkedList* L) /求表长的函数 if(L-pData) /判断单链表是否被分配内存 return L-length; /返回单链表的长度 return -1; /单链表没有分配内存时, 返回-1/* 求前驱 */int GetPrior(LinkedList* L, int x) struct Node *temp=L-pData-next,*prior=L-pData; /temp指向第1个元素, prior指向temp前一个元素 while(temp) /当temp指向的节点不为空时循环 if (temp-ele!=x) /判断指针temp指向

11、的节点的值是否是否等于目标值 prior=temp; /使指针prior指向指针temp指向的节点空间 temp=prior-next; /将指针temp指向后一节点 else if(prior!=L-pData) /判断指针prior指向的节点是否是头节点 /头结点无前驱 return prior-ele; /返回指针prior指向的节点的值域的值 else if(prior=L-pData) /判断指针prior指向的节点是否是头节点 printf(首节点无前驱,); return ERROR; /返回值表示操作失败 printf(无此元素,); return ERROR; /返回值表示操

12、作失败/* 求后继 */int GetNext(LinkedList* L, int x) struct Node *temp=L-pData-next; /temp指向第1个元素,prior指向temp前一个元素 while(temp) /当temp指向的节点不为空时循环 if (temp-ele!=x) /判断指针temp指向的节点的值是否是否等于目标值 temp=temp-next; /使指针temp指向下一节点空间 else if (temp-next!=NULL) /判断指针temp指向的节点是否是尾节点 return temp-next-ele; /返回指针temp指向的节点的后一

13、节点的值域的值 else if(temp-next=NULL) /判断指针temp指向的节点是否是尾节点 printf(尾节点无后继,); return ERROR; /返回值表示操作失败 printf(无此元素,); return ERROR; /返回值表示操作失败/* 按位置查找元素 */int GetElem(LinkedList* L, int i) int k=1; struct Node* temp=L-pData; /使指针temp指向头结点 if(0=i|!L-pData|iL-length) /判断查找的位置是否合法 printf(单链表不存在或是为空表,); return

14、ERROR; /返回值表示操作失败 for(k=1;knext; /使指针temp指向下一节点空间 return temp-ele; /返回指针temp指向的节点的值域的值 /* 查找元素第一个位置, 若无返回-1 */int GetPosition(LinkedList* L, int x) int k=0; struct Node* p; /定义指向节点的指针 if(!L-pData) /判断单链表是否被分配内存 printf(单链表不存在!n); p=L-pData; /将指针p指向头结点 for(k=1;klength;k+) /循环查找元素位置 p=p-next; /使指针p指向下一

15、节点空间 if(p-ele=x) /判断是否与指定值相符 return k; /返回值表示查到的位置 return -1; /返回值表示单链表中无此元素/*判断是否为空: 1为空, 0为非空*/int IsEmpty(LinkedList* L) if(!L-pData) /判断单链表是否被分配存储空间 printf(单链表不存在!n); return L-length=0; /返回值表示单链表是空的void main() LinkedList* L=NULL; L=InitList(L); / 初始化顺序表 PrintList(L); / 打印顺序表 InsertElem(L, 10, 1)

16、; / 把元素10插入到第1个位置 InsertElem(L, 12, 1); / 把元素10插入到第1个位置 InsertElem(L, 14, 1); / 把元素10插入到第1个位置 PrintList(L); / 打印顺序表 printf(获取元素10位置:); printf(%dn, GetPosition(L, 10); / 获取元素10所在的位置 printf(获取第三个元素:); printf(%dn, GetElem(L, 3); / 获取第i个元素 printf(删除第二个元素后); DeleteElem(L,2); PrintList(L); / 打印顺序表 if(IsEmpty(L) printf(顺序表是空的n); else printf(顺序表是非空的n); SetEmpty(L); / 把顺序表置空 PrintList(L); / 打印顺序表 DestroyList(L); / 不要忘了 PrintList(L); / 打印顺序表 if (NULL!=L) free(L);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1