创建循环双链表,并进行两个链表合并操作

来源:互联网 发布:成都php找工作很难2017 编辑:程序博客网 时间:2024/06/05 22:39

创建循环双链表,并进行两个链表合并操作

L1={1,2,3,4,5,6},L2={11,22,33,44,55,66}当i=0时,将L2链接到L1前,i大于0小于6时,插入第i个位置,i大于6是,链接到L1后面

实现代码:

#include <stdio.h>#include <stdlib.h>typedef struct DNode{int data;struct DNode *prior;struct DNode *next;}DLinkNode;void CreateF(DLinkNode *&L,int a[],int n){DLinkNode *s,*L1;L=(DLinkNode*)malloc(sizeof(DLinkNode));L->prior=L->next=L;L1=L;for(int i=0;i<n;i++){s=(DLinkNode*)malloc(sizeof(DLinkNode));s->data=a[i];L1->next=s;s->prior=L1; s->next=L;L->prior=s;L1=s;}}void Insert(DLinkNode *&ha,DLinkNode *&hb,int i){DLinkNode *p=ha->next,*post;int lena=1,j;while(p->next!=ha){lena++;p=p->next;}if(i==0){p=hb->prior;//由于ha头结点要摘下来,所以必须这么做 p->next=ha->next;//要画图才能容易地看出关系 ha->next->prior=p;ha->next=hb->next;hb->next->prior=ha;}else if(i<lena){j=1;p=ha->next;//前面改变了p,所以这里要还原 while(j<i){p=p->next;//找到待插入点前面结点 j++;}post=p->next;p->next=hb->next;hb->next->prior=p;hb->prior->next=post;post->prior=hb->prior;}else{ha->prior->next=hb->next;hb->next->prior=ha->prior;hb->prior->next=ha;ha->prior=hb->prior;}free(hb);} void Show(DLinkNode *L){DLinkNode *p=L->next;while(p!=L){printf("%d ",p->data);p=p->next;}}int main(int argc, char *argv[]){int i,a[6]={1,2,3,4,5,6},b[6]={11,22,33,44,55,66}; DLinkNode *L1,*L2;CreateF(L1,a,6);CreateF(L2,b,6);printf("输出L1序列:");Show(L1);printf("\n输出L2序列:");Show(L2);printf("\n输如需要插入的位置i:");scanf("%d",&i);Insert(L1,L2,i);printf("输出插入后序列:");Show(L1);printf("\n");return 0;}

输出结果:

输出L1序列:1 2 3 4 5 6输出L2序列:11 22 33 44 55 66输如需要插入的位置i:8输出插入后序列:1 2 3 4 5 6 11 22 33 44 55 66请按任意键继续. . .


阅读全文
0 0
原创粉丝点击