数据结构_2:链表:C语言练习
2016-01-02 10:42
489 查看
带头结点的单链表中,删除所有值为x的节点,释放其空间
链表反向输出(不是反转)
删除带头结点的单链表L中最小值
链表反转
链表增序
寻找两个单链表的公共节点
两个有序表,依次增序,合并成一个递减序列
判断是否是自序列
//用p从头到尾扫描单链表,pre指向*p节点的前驱。若p的节点是x则删除,并让p后移,否则,pre和p同时移动 void Del_x_1(LinkList &L,ElemType x) { LNode *p=L->next,*pre=L,*q; while(p!=NULL) { if(p->data=x) { q=p; p=p->next; pre->next=p; free(q); } else { pre=p; p=p->next; } } } //尾插法:值不为x则接入L,否则释放 void Del_x_2(LinkList &L,ElemType x) { LNode *p=L->next,*r=L,*q; while(p!=NULL) { if(p->data!=x) { r->next=p; r=p; p=p->next; } else { q=p; p=p->next; free(q); } } }
链表反向输出(不是反转)
void R_print(LinKList L) { if(L->next!=NULL) R_print(L->next); printf(L->data); }
删除带头结点的单链表L中最小值
//p扫描单链表,pre指向*p节点的前驱,minp保存最小节点指针(初值是p),minpre是指向minp的前驱(初值是pre) //若p->data小于minp-》data,则将p,pre,分布赋予minp和minpre LinkList Del_Min(LinkList &L) { LNode *pre=L,*p=pre->next; LNode *minpre=pre, *min=p; while(p!=NULL) { if(p->data<minp->data) { minp=p; minpre=pre; } pre=p; p=p->next; } minpre->next=minp->next; //删除最小值 free(minp); return L; }
链表反转
//将头结点摘下,然后从第一节点开始,一次前插入到头结点后面 LinkList R_1(LinkList &L) { p=L->next; L->next=NULL; while(p!=NULL) { r=p->next; p->next=L->next; L->next=p; p=r; } return L; } //pre,p,r LinkList R_2(LinkList &L) { LinkList *pre,*p=L->next;*r=p->next; p->next=NULL; //处理第一个节点 while(r!=NULL) { pre=p; p=r; r=r->next; p->next=pre; } L->next=p; return L; }
链表增序
void Sort(LinkList &L) { LNode *p=L->next;*pre; Lnode *r=p->next; p->next=NULL; p=r; while(p!=NULL) { r=p->next; pre=L; while(pre->next!=NULL && pre->next->data<p->data) pre=pre->next; p->next=pre->next; pre->next=p; p=r; } }
寻找两个单链表的公共节点
//计算长度差,在长单链表上先遍历长度长度之差,,在遍历两个链表 LinkList Search_List_Common(LinkList L1,LinkList L2) { int len1=Length(L1),len2=Length(L2); LiNKList longlist,shortlist; if(len1>len2) { longlist=L1->next; shortlist=L2->next; dist=len1-len2 } else { longlist=L2->next; shortlist=L1->next; dist=len2-len1; } while(dist--) longlist=longlist->next; while(longlist!=NULL) { if(longlist=shortlist) return longlist; else { longlist=longlist->next; shortlist=shortlist->next; } } return NULL; }
两个有序表,依次增序,合并成一个递减序列
//头插法 void MergeList(LinkList &La,LinkList &Lb) { LNode *r,*pa=La->next,*pb=Lb->next; La->next=NULL; while(pa&&pb) { if(pa->data<=pb->data) { r=pa->next; pa->next=La->next; La->next=pa; pa=r; } else { r=pa->next; pb->next=La->next; La->next=pn; pb=r; } } if(pa) pa=pb; while(pb) { r=pb->next; pb->next=La->next; La->next=pb; pb=r; } free(Lb); }
判断是否是自序列
int Pattern(LinkList A,LinkList B) { LNode *p=A; LNode *pre=p; LNode *q=B; while(p&&q) if(p->data==q->data) { p=p->next; q=q->next; } else { pre=pre->next; p=pre; q=B; } if(q==NULL) return 1; else return 0; }
相关文章推荐
- 学数据结构,是不是一定要先学离散数学
- 数据结构学习——队列
- 数据结构链表总结一
- linux系统的体系结构以及文件数据结构
- 数据结构学习笔记——顺序存储结构
- 09 链表中找出倒数第k个数 & 找出链表正中间的数据
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现
- 数据结构学习——栈
- poj 1988 Cube Stacking 数据结构 并查集
- 数据结构_2:链表:C语言
- 【Java数据结构】链表
- python 数据结构常用的模块
- 小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈
- 【数据结构】之队列的java实现(二)
- 【数据结构】之队列的java实现(一)
- 【数据结构】之链栈的java实现
- 【数据结构】之二叉树的java实现
- 数据结构(四)
- 08 将奇数排在偶数之前
- 07 打印1到最大的n位数