会员
周边
众包
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
spring学习笔记
数据结构之链表合并算法
//链表合并算法(包括一些基本运算) #include<iostream> using namespace std; typedef char datatype; //结点数据类型,假设为char typedef struct node * pointer; //结点指针类型 struct node //结点结构 { datatype data; pointer next; }; typedef pointer lklist; //单链表类型,即头指针类型 //链表初始化 lklist initlist() //建立一个只有头结点的空表 { pointer head; head=new node; head->next=NULL; return head; } //尾插法建表 lklist creat() //有头结点,返回表头结点 { lklist head; pointer rear,s; char ch; head=new node; //生成头结点 rear=head; //尾指针初值指向头结点 cin>>ch; while(ch!='¥') //读入结点值,并检测是否为检测符 { s=new node; //生成新结点 s->data=ch; rear->next=s; rear=s; cin>>ch; } rear->next=NULL; return head; } //求表长 int length(lklist head) { int j; pointer p; j=0; //计算器 p=head->next; //从首结点开始算起 while(p!=NULL) { j++; //计数 p=p->next; //到下一结点 } return j; //返回链表长度 } //查找(按序号) pointer find(lklist head,int i) { int j; pointer p; if(i<0) return NULL; //位置非法,无此结点 j=-1; //计数器 p=head; //从头结点开始搜索 while(p!=NULL) { j++; if(j==i) break; //找到,跳出循环 p=p->next; //未找到,继续下一结点 } return p; } //定位(按值查找) pointer locate(lklist head,datatype x) { pointer p; p=head->next; //从首结点开始搜索 while(p!=NULL) { if(p->data==x) break; //找到,跳出循环 p=p->next; //下一结点 } return p; } //插入算法 int insert(lklist head,datatype x,int i) { pointer q,s; q=find(head,i-1); if(q==NULL) { cout<<"非法插入位置!\n"; return 0; } //无第i-1点 s=new node; //生成新结点 s->data=x; s->next=q->next; //新结点的后继是原第i个点 q->next=s; //原第i-1个点的后继是新点 return 1; //插入成功 } //删除运算 int Delete(lklist head,int i) { pointer p,q; q=find(head,i-1); if(q==NULL||q->next==NULL) { cout<<"非法删除位置!\n"; return 0; } p=q->next; //保存待删除结点的地址,用于释放空间 q->next=p->next; //修改前驱的指针 delete p; //释放已删除的结点的空间 return 1; //删除成功 } //链表合并(就地进行) lklist purge(lklist A,lklist B) { lklist C; //定义一个链表,用于存放合并后的所有结点 pointer p,q,r; //定义分别指向链表A,B,C链表的指针 p=A->next; q=B->next; C=A; r=C; //去A作为C的头结点 while(p!=NULL&&q!=NULL) { if(p->data<=q->data) { r->next=p; r=p; p=p->next; } else { r->next=q; r=q; q=q->next; } } if(p!=NULL) r->next=p; //A表还有剩余结点 else r->next=q; delete B; //释放B结点 return C; } //输出链表所有结点 int display(lklist head) { pointer p; p=head->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } return 1; } //主函数只验证链表合并算法结果 int main() { lklist A,B; A=initlist(); //初始化 B=initlist(); cout<<"哈喽,欢迎来到wwj数据结构学习乐园!!!!"<<endl; cout<<"请输入链表A的数据,以' 结束"<<endl; A=creat(); //建表 cout<<"链表A的各结点的数据如下:"<<endl; display(A); cout<<endl; cout<<"请输入链表B的数据,以' 结束"<<endl; B=creat(); cout<<"链表B的各结点的数据如下:"<<endl; display(B); cout<<endl; cout<<"合并后的链表各结点数据如下:"<<endl; display(purge(A,B)); //合并后链表数据 return 0; }
posted on
2011-12-19 22:16
spring学习笔记
阅读(
422
) 评论(
0
)
编辑
收藏
举报
刷新页面
返回顶部
导航
博客园
首页
联系
订阅
管理
公告