单链表的基本操作
来源:互联网 发布:如何制作淘宝首页模板 编辑:程序博客网 时间:2024/06/06 11:38
一些单链表的基本操作,具体的都在注释里,直接主函数调用即可
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;void Create_List_Head(LinkList &L){ //带头结点的链表 int data; LNode *p,*q; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; q=L; scanf("%d",&data); while(data!=0){ p=(LinkList)malloc(sizeof(LNode)); p->data=data; q->next=p; q=p; scanf("%d",&data); } q->next=NULL;}void Create_List(LinkList &L){ //不带头结点的链表 int data; LNode *p,*q; L=(LinkList)malloc(sizeof(LNode)); L=NULL; while(scanf("%d",&data)&&data){ q=(LinkList)malloc(sizeof(LNode)); q->data=data; if(L==NULL){ L=q; p=q; } else{ p->next=q; p=q; } } p->next=NULL;}void print(LinkList L){ //打印不带头结点链表 LNode *p; p=L; while(p!=NULL){ printf("%d ",p->data); p=p->next; } printf("\n");}void print_Head(LinkList L){ //打印带头节点链表 LNode *p; p=L->next; while(p!=NULL){ printf("%d ",p->data); p=p->next; } printf("\n");}void del_x(LinkList &L,int x){ //不带头结点,删除值为x的节点 LNode *p; if(L==NULL) return ; if(L->data==x){ p=L; L=L->next; free(p); del_x(L,x); } else del_x(L->next,x);}void del_Head(LinkList &L,int x){ //带头结点,删除值为x的元素 LNode *p; if(L->next==NULL) return; if(L->next->data==x){ p=L->next; L->next=p->next; free(p); del_Head(L,x); } else del_Head(L->next,x);}void reverse_print(LinkList L){ //逆序输出 if(L->next==NULL) return; reverse_print(L->next); printf("%d ",L->next->data);}void del_min(LinkList &L){ //删除唯一最小值 LNode *pre=L,*p=L->next; LNode *minpre=L,*minp=p; while(p!=NULL){ if(p->data<minp->data){ minp=p; minpre=pre; } pre=p,p=p->next; } minpre->next=minp->next; free(minp);}void rev(LinkList &L){ //链表反转 LNode *p,*q; p=L->next; L->next=NULL; while(p!=NULL){ q=p->next; p->next=L->next; L->next=p; p=q; }}void Sort(LinkList &L){ //链表排序 LNode *p,*r,*pre; p=L->next; 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; }}void del_lr(LinkList &L,int l,int r){ //删除值在[l,r]之间的节点 LNode *p; if(L->next==NULL) return; p=L->next; if(p->data>=l&&p->data<=r){ L->next=p->next; free(p); del_lr(L,l,r); } else del_lr(L->next,l,r);}void create_two(LinkList L,LinkList &A,LinkList &B){ A=(LinkList)malloc(sizeof(LNode)); //按标号奇偶拆成两个链表 B=(LinkList)malloc(sizeof(LNode)); int op=1; LNode *r,*ra,*rb; r=L->next; A->next=NULL,ra=A; B->next=NULL,rb=B; while(r!=NULL){ if(op%2){ ra->next=r; ra=ra->next; } else{ rb->next=r; rb=rb->next; } op++; r=r->next; } ra->next=NULL; rb->next=NULL;}void union_head(LinkList &L){ //递增链表去重 LNode *p,*q; if(L==NULL) return; p=L->next; if(p->next!=NULL){ q=p->next; if(q->data==p->data){ p->next=q->next; free(q); union_head(L); } else union_head(p); }}void mergelist(LinkList &A,LinkList &B){ //两个递增的链表A,B,合并成一个递减的链表A LNode *r,*ra,*rb; ra=A->next; rb=B->next; A->next=NULL; while(ra&&rb){ if(ra->data<rb->data){ r=ra->next; ra->next=A->next; A->next=ra; ra=r; } else{ r=rb->next; rb->next=A->next; A->next=rb; rb=r; } } if(rb) ra=rb; while(ra){ r=ra->next; ra->next=A->next; A->next=ra; ra=r; } free(B);}LinkList mergesame(LinkList &A,LinkList &B){ //用A,B中相同元素建立链表C,且不破坏A,B LNode *c,*r,*s,*ra,*rb; c=(LinkList)malloc(sizeof(LNode)); r=c; ra=A->next; rb=B->next; while(ra&&rb){ if(ra->data<rb->data) ra=ra->next; else if(ra->data>rb->data) rb=rb->next; else{ s=(LinkList)malloc(sizeof(LNode)); s->data=ra->data; r->next=s; r=r->next; ra=ra->next; rb=rb->next; } } r->next=NULL; return c;}void uniontoA(LinkList &A,LinkList &B){ //A,B递增,将A,B交集存入A中 LNode *r,*p,*ra,*rb; ra=A->next; rb=B->next; r=A; while(ra&&rb){ if(ra->data<rb->data){ p=ra; ra=ra->next; free(p); } else if(ra->data>rb->data){ p=rb; rb=rb->next; free(p); } else{ r->next=ra; r=r->next; p=rb; ra=ra->next; rb=rb->next; free(p); } } r->next=NULL; while(ra){ p=ra; ra=ra->next; free(p); } while(rb){ p=rb; rb=rb->next; free(p); } free(B);}void kmp(LinkList &A,LinkList &B){ //判断B是否为A的子序列 LNode *ra,*rb,*st; st=A->next; ra=A->next; rb=B->next; while(st){ if(ra->data==rb->data){ ra=ra->next; rb=rb->next; if(rb==NULL){ puts("yes"); return; } } else{ st=st->next; ra=st; rb=B->next; } } puts("no"); return;}int main(){ LinkList L,A,B,C; return 0;}
阅读全文
0 0
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作!
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- 单链表的基本操作
- MySQL更新FROM从句中的字段 mysql [Err] 1093
- ueditor和xss的二三事
- Linux基础—目录结构及相应用途
- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
- 尼科彻斯定理
- 单链表的基本操作
- poj 1852 Ants
- React Native 学习笔记(二)
- Objective-C中的协议(protocol)与委托
- 机器学习基础,入门介绍
- 欢迎使用CSDN-markdown编辑器
- java对象 父对象 的 对应关系
- 有序的数组中找到某一目标值首次出现的下标
- JavaScript Array 对象的方法