带头节点的链表
来源:互联网 发布:新版淘宝收藏店铺在哪 编辑:程序博客网 时间:2024/05/21 03:29
链表的基本操作
#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef int type;typedef struct Node{ type info; struct Node *next;}node;//建立一个头节点并将其指针返回node *node_init(){ node *head=(node*)malloc(sizeof(node)); head->next=NULL; return head;}//打印一个链表void node_display(node*head){ node*p=head->next; if(!p){ printf("EMPTY\n"); } else{ while(p){ printf("%5d",p->info); p=p->next; } printf("\n"); }}//找到第n个节点并返回其指针,若n==0则返回头节点指针node* node_find(node*head,int n){ int i=0; node *p=head; if(n<0){ printf("not\n"); return NULL; } else if(n==0){//第零个位置的节点:头节点 return head; } while(p&&i<n){//找到第i个节点的地址 p=p->next; i++; } if(!p)printf("not\n"); return p;}//在pos个节点的位置插入一个值为num的节点void node_insert(node*head,int pos,type num){ node*pre=node_find(head,pos-1),*q;//找到前驱节点 if(!pre){ printf("not\n"); } else{ q=(node*)malloc(sizeof(node)); q->info=num; q->next=pre->next; pre->next=q; }}//删除第pos个节点void node_dele(node*head,int pos){ node*pre=node_find(head,pos-1),*q; if(!pre){ printf("not\n"); } else{ q=pre->next; pre->next=q->next; free(q); }}//删除整个链表并释放内存void node_destory(node*head){ node*p=head,*q; while(p){ q=p->next; free(p); p=q; }}
课后习题部分
//返回第i个节点的值type node_get(node*head,int i){ node*p=node_find(head,i); if(!p){ printf("not\n"); exit(1); } return p->info;}//返回值为x的节点的位置是第几个节点int node_Get(node*head,type x){ int i=1; node*pre=head,*p=head->next; while(pre&&p&&p->info!=x){ pre=p; p=p->next; i++; } if(p)return i; else return -1;}//返回值为x的节点的指针node*node_Find(node*head,type x){ node*pre=head,*p=head->next; while(pre&&p&&p->info!=x){ pre=p; p=p->next; } if(p){ return p; } else{ printf("not\n"); return NULL; }}//把p2链表连接的p1后面void node_cat(node*p1,node*p2){ node*p=p1; while(p->next){ p=p->next; } p->next=p2->next; free(p2);}//把p2链表插入到p1节点的第n个节点的位置void node_Insert(node*p1,int n,node*p2){ node*pre=node_find(p1,n-1),*p=p2; if(!pre){ printf("node_Insert error\n"); } else{ while(p->next){ p=p->next; } p->next=pre->next; pre->next=p2->next; free(p2); }}//删除p1,节点的从begin开始的n个节点void node_Del(node*p1,int begin,int n){ int i; for(i=1;i<=n;i++) node_dele(p1,begin);}//返回节点的和int node_sum(node*head){ node*p=head->next; int sum=0; while(p){ sum+=p->info; p=p->next; } return sum;}//创建链表,当输入的值为负数结束void node_create(node*head){ node*p=head,*pre; while(1){ pre=(node*)malloc(sizeof(node)); pre->next=NULL; scanf("%d",&pre->info); if(pre->info<0){ free(pre); break; } else{ p->next=pre; p=pre; } }}//计算链表节点数int node_count(node*head){ int i=0; node*p=head->next; while(p){ p=p->next; i++; } return i;}//在值为y的节点前面插入xvoid node_insert_xy(node *head,type x,type y){ node*p=head,*pre=p->next,*q; while(pre&&pre->info!=y){ p=pre; pre=pre->next; } if(pre&&pre->info==y){ q=(node*)malloc(sizeof(node)); q->next=NULL; q->info=x; q->next=pre; p->next=q; } else printf("error\n");}//倒置链表void node_reverse(node*head){ node*pre=NULL,*mid=head->next,*next; while(mid){ next=mid->next; mid->next=pre; pre=mid; mid=next; } head->next=pre;}//将链表的偶数部分保留,奇数部分赋给另外一个链表,并返回其头指针node *node_divide(node*head1){ node*head2=(node*)malloc(sizeof(node)); node *p2=head2,*p=head1,*pre=p->next; while(pre){ if(pre->info%2!=0){ p->next=pre->next; p2->next=pre; p2=pre; } else p=pre; pre=pre->next; } p2->next=NULL; p->next=NULL; return head2;}//删除链表中大约x不大于y的节点void node_dele_XtoY(node*head,int x,int y){ node*p=head,*pre=p->next,*pmid; while(pre){ pmid=pre->next; if(pre->info>x&&pre->info<=y){ p->next=pre->next; free(pre); } else p=p->next; pre=pmid; }}
0 0
- 带头节点的链表
- 带头节点和不带头节点的链表
- 带头节点链表和不带头节点链表的初始化
- 链表的创建(带头节点以及不带头节点)
- 不带头节点的链表的不带头结点的链表,仅供参考
- 带头节点的链表和不带头结点的链表有何不同
- 带头节点的链表的一些操作
- 不带头节点链表逆序的两种方法
- 不带头节点的双向循环链表基本操作
- 约瑟夫问题(带头节点的循环链表)
- 不带头节点的单向链表逆序
- 带头节点链表的前插法,后插法,顺序添加法
- 实际应用中带头节点的线性链表
- 链表的增删改查(带头节点)
- 数据结构示例之带头节点的双向循环链表
- 数据结构示例之带头节点的、单循环链表
- 数据结构示例之带头节点的双向循环链表
- 链表操作(不带头节点的)
- 阿里巴巴消息中间件团队消息和分布式数据层负责人王晶昱:消息系统架构与变迁
- hadoop+hbase海量小图片处理
- tolua总结(一)
- ios 同步Get请求的实现
- 单片机相关名词解释总结
- 带头节点的链表
- ViewPager+Fragment+广播来实现一个滑动页面切换
- NYOJ D的小L 366
- 为何ViewController释放后不走dealloc
- 怎么上Google
- Building Ogre in Windows 7/8 using Visual Studio 2012
- 正则应用之——日期正则表达式
- Java学习记录(五)super关键字的用法
- project02:阶段性总结