单链表相关操作
来源:互联网 发布:夜鹰大神是谁淘宝 编辑:程序博客网 时间:2024/05/20 13:20
- #include "stdio.h"
- #include "stdlib.h"
- #define OK 1
- #define ERROR 0
- typedef ElemType int;
- typedef struct LNode{
- ElemType data; //数据域
- struct LNode *next; //指针域
- }LNode;
- typedef LNode *LinkList; //单链表类型名
- void WarnMessage(char *s)
- {
- printf(s);
- }
- LNode* CreateNode(ElemType e)//创建结点
- {
- LNode *temp = (LNode*)malloc(sizeof(LNode));
- temp->data = e;
- temp->next = NULL;
- return temp;
- }
- void DestoryList_Link(LinkList *LHead)//销毁单链表;
- /*从头结点开始,释放每个结点的空间*/
- {
- if(NULL == *LHead)
- {
- WarnMessage("\nThere are no Nodes to be freed!\n");
- return;
- }
- else{
- LinkList p;
- /*从头结点开始,一一释放结点的空间*/
- while(*LHead){
- p = (*LHead)->next;
- free(*LHead);
- *LHead = p;
- }
- }
- }
- int ListLength_Link(LinkList *LHead)//求链表长度;
- /*通过遍历各结点,将长度length加一*/
- {
- int length = 0;//定义表长变量length并初始化为0;
- if(NULL == *LHead)
- {
- return 0;
- }
- LNode *p = *LHead;
- while(p){
- length++;
- p=p->next;
- }
- return length;
- }
- void ListInsert_Link(LinkList *LHead,int i,LNode *node)//在单链表中插入元素;
- /*在单链表L中第i个位置之前插入值e的结点,1<=i<=表长+1;*/
- {
- if(NULL == *LHead){
- *LHead = node;/*如果头结点指针域为空,则当前结点作为第一个结点*/
- return ;
- }
- /*头结点指针域不为空,指针指向第一个结点
- **移动指针,找到相应的插入位置;
- */
- LNode *p = *LHead;
- int k=0;
- while(p && k<(i-1)){
- k ++;
- p = p->next;
- }
- if(!p ||(k > i-1)){
- WarnMessage("Input Error,Insert Failed!\n");
- }
- else{
- node->next = p->next;
- p->next = node;
- }
- }
- ElemType GetElem_Link(LinkList *LHead,int i)//某位置i取元素值;
- {
- ElemType re_data = 0;
- if(NULL == *LHead){
- return ERROR;
- }
- if(i>ListLength_Link(LHead)){
- printf("input error!\n");
- return ERROR;
- }
- LinkList Temp = *LHead;
- int k = 0;
- while(Temp && k<(i-1)){
- Temp = Temp->next;
- k++;
- }
- re_data = Temp->data;
- return re_data;
- }
- State ListDelete_Link(LinkList *LHead,int i)//删除特定的元素。
- /*在带头结点的单链表中,删除第i个元素*/
- {
- LinkList p,temp;
- if(NULL == *LHead){
- WarnMessage("NO Node to be deleted!");
- return ERROR;
- }
- if(i>ListLength_Link(LHead)){
- return ERROR;
- }
- p = *LHead;
- int k = 0;
- while(p->next && (k<i-1)){
- p = p->next;
- ++k;
- }
- temp = p->next;
- p->next = temp->next;
- free(temp);
- return OK;
- }
- int LocateElem_Link(LinkList *LHead,ElemType e)//定位元素的位置。
- /*根据结点数据值,找到到其所在位置*/
- {
- LinkList p = *LHead;
- int k=0;
- while(p&&(p->data != e))
- {
- p=p->next;
- ++k;
- }
- return k;
- }
- void LNode_Traver(LinkList *LHead)
- /*从头结点开始遍历整个链表*/
- {
- LinkList p = *LHead;
- while(NULL != p)
- {
- printf("%d-->",p->data);
- p = p->next;
- }
- WarnMessage("\n\n");
- }
- /*
- **根据结点数据域的大小进行由大到小的排序
- */
- /*这个排序方法不怎么实用
- void Sort_LinkList(LinkList *LHead){
- LinkList p,q,big;
- Elemtype temp;
- for(p = (*LHead)->next;p->next;p = p->next){
- big = p;
- for(q = p->next;q->next;q = q->next){
- if(q->data > big->data){
- big = q;
- }
- }
- if(p != big){
- temp = p->data;
- p->data = big->data;
- big->data = temp;
- }
- }
- }
- */
- //另一种单链表排序方法
- void selectsort(LinkList *g)
- {
- LNode *p,*q,*t,*s,*h;
- h=(LNode *)malloc(sizeof(LNode));
- h->next=*g; /*h-->g的第一个结点*/
- p=h; //p,h->同一地址
- while(p->next->next!=NULL)
- {
- for(s=p,q=p->next;q->next!=NULL;q=q->next)
- if(q->next->data<s->next->data)
- s=q;
- if(s!=q)
- {
- t=s->next;
- s->next=t->next;
- t->next=p->next;
- p->next=t;
- }
- p=p->next;
- }
- *g=h->next;
- free(h);
- }
- /*将两个单链表A,B归并成新的单链表C
- **设置两个指针分别指向A,B的第一个结点,第三个指针指向空表
- **当其中一个表为空时,表示其已并完,只需将另一表中元素归并到C中;
- */
- void MergeList_L(LinkList *HeadA,LinkList *HeadB,LinkList *HeadC){
- LinkList pa,pb,pc;
- /*pa,pb分别指向第一个结点,pc作为新链表的头指针*/
- pa = (*HeadA)->next;
- pb = (*HeadB)->next;
- *HeadC = pc = *HeadA; //将HeadA的头结点作为HeadC头结点
- while(pa && pb){
- if(pa->data <= pb->data){
- pc->next = pa;
- pc = pa;//移动结点指针至新插入的当前结点
- pa = pa->next;
- }
- else{
- pc->next = pb;
- pc = pb;
- pb = pb->next;
- }
- }
- pc->next = pa ? pa : pb;
- free(*HeadB);
- }
- 以上代码还是有点小问题,比如最后一个归并函数,我运行的时候,居然把链表B的首结点删除了,还是需要改进,还有就是单链表排序问题,第一个排序没有起到作用;
0
上一篇:Windows信使服务Messenger的安装
下一篇:双链表有关操作的实现
相关热门文章
- (三)区分的意义 明确不同财...
- Oracle 聚簇因子
- 小甲鱼PE详解之基址重定位详解...
- 小甲鱼PE详解之输入表(导入表...
- 小甲鱼PE详解之区块描述、对齐...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 我的博客被删了,请问怎么联系...
- 一个访问量较大网站的服务器。...
- 收音机驱动与v4l2架构的关系,...
- 如何将linux驱动改为裸机驱动(...
- Fedora 20开机卡在LOGO界面,...
给主人留下些什么吧!~~
评论热议
0 0
- 单链表相关操作
- 单链表的相关操作
- 单链表的相关操作
- 循环单链表相关操作
- 单链表相关操作代码
- 单链表相关操作
- 单链表相关操作
- 单链表相关操作
- 单链表及其相关操作
- 单链表的相关操作
- 单链表及相关操作
- 单链表相关操作
- 单链表相关操作
- 单链表的相关操作
- 单链表的相关操作
- 对单链表的相关操作
- c++单链表的相关操作
- LintCode(2):单链表相关操作
- compute_v2
- (转)linux下删除乱码文件名
- 记录的查增删(模拟)_ComboBox
- Android--操作图片Exif信息
- Windows信使服务Messenger的安装
- 单链表相关操作
- 双链表有关操作的实现
- 2009年软考真题与解析--自己测考顺便发给需要的人(自己从考试资源网那手动整理)
- 常量指针与指针常量
- 一些测试例_C
- volatile的作用
- 今天面试遇到的题
- 又遇到的一些
- 栈内存与堆内存的区别
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
宝骏怎么样
宝骏系列
宝骏新款
保俊
宝骏suv自动挡
宝骏车标
宝骏标志
宝骏车标图片
宝骏标志图片
宝信
宝信b股吧
宝信b
宝信软件
上海宝信软件股份有限公司
宝健商城
宝健直销
宝健即溶茶
宝健怎么样
宝健螺旋藻价格
宝健全部产品价格表
宝健减肥产品管用吗
宝健蛋白质粉
宝健乳钙咀嚼片价格
宝健空气净化器
宝健个人业绩查询
宝健益生菌多少钱一盒
宝健胶原蛋白固体饮料
宝健日用品有限公司
宝健胶原蛋白多少钱
宝健复合蛋白质粉
宝健胶原蛋白怎么样
宝健螺旋藻片
宝健产品
宝健网上商城
宝酷社区登陆
北京宝健产品价格表
宝健产品价格表图片
宝健产品价格表
宝健中国产品害处
宝健产品怎么样
宝健牌保健品曝光