数据结构实现对2个链表La,Lb进行合并,对相同的元素进行删除,能不能帮忙修改下。

龙开义 2019-12-21 18:32:00

推荐回答

typepoint=^node;node=record    data:integer;    next:point;   end;varh1,h2,h:point;procedureprtp:point;//打印链表beginp:=p^.next;whilep<>nildobegin writep^.data,''''; p:=p^.next;end;writeln;end;procedurecreatvarh:point;//建立链表varx:integer;p,q:^node;beginwriteln''请输入升序的数,负数结束:'';newh;p:=h;readx;whilex>=0dobegin newq; q^.data:=x; p^.next:=q; p:=q; readx;end;p^.next:=nil;end;functionmerge_linkvarp,q:point:point;//升序合并二个升序链表varh,w:^node;beginw:=p;p:=p^.next;disposew;//回收一个头结点,p指向首个数据结点w:=q;h:=q;q:=q^.next;//h:合并后的头结点,q指向首个数据结点whilep<>nilandq<>nildo//当二个链表都不空时 ifp^.datanilthenw^.next:=p;//将未完的链表接入ifq<>nilthenw^.next:=q;//将未完的链表接入merge_link:=h;//返回合并后的链表头指针end;begincreath1;creath2;h:=merge_linkh1,h2;writeln''合并后的链表:'';prth;end。
连传宝2019-12-21 19:15:01

提示您:回答为网友贡献,仅供参考。

其他回答

  • 下面这个程序基本上就是单链表的基本操作,是一个完整的可以在机器上运行的程序。供参考。include/*malloc等*/#include/*scanf,NULL*/#include/*free*/#include/*getch*//*函数结果状态代码*/#defineOK1#defineERROR0typedefintStatus;typedefintElemType;typedefstructLNode{ElemTypedata;structLNode*next;}LNode,*LinkList;voidCreateListLinkList*L,intn/*算法2.11*/{/*逆位序插在表头输入n个元素的值,建立带表头结构的单链线性表L*/inti;LinkListp;*L=LinkListmallocsizeofstructLNode;*L->next=NULL;/*先建立一个带头结点的单链表*/printf"请输入%d个数据",n;fori=n;i>0;--i{p=LinkListmallocsizeofstructLNode;/*生成新结点*/scanf"%d",&p->data;/*输入元素值*/p->next=*L->next;/*插入到表头*/*L->next=p;}}voidCreateList2LinkList*L,intn{/*正位序插在表尾输入n个元素的值,建立带表头结构的单链线性表L*/inti;LinkListp,q;*L=LinkListmallocsizeofstructLNode;/*生成头结点*/*L->next=NULL;q=*L;printf"请输入%d个数据",n;fori=1;idata;q->next=p;q=q->next;}p->next=NULL;}voidPrintlinklistLinkListL{LNode*p;p=L->next;whilep{printf"%d",p->data;ifp->nextprintf"-->";p=p->next;}printf"";}StatusListInsertLinkListL,inti,ElemTypee/*算法2.9。不改变L*/{/*在带头结点的单链线性表L中第i个位置之前插入元素e*/intj=0;LinkListp=L,s;whilep&&jnext;j++;}if!p||j>i-1/*i小于1或者大于表长*/returnERROR;s=LinkListmallocsizeofstructLNode;/*生成新结点*/s->data=e;/*插入L中*/s->next=p->next;p->next=s;returnOK;}StatusListDeleteLinkListL,inti,ElemType*e/*算法2.10。不改变L*/{/*在带头结点的单链线性表L中,删除第i个元素,并由e返回其值*/intj=0;LinkListp=L,q;whilep->next&&jnext;j++;}if!p->next||j>i-1/*删除位置不合理*/returnERROR;q=p->next;/*删除并释放结点*/p->next=q->next;*e=q->data;freeq;returnOK;}voidmain{inti,n=5;LinkListLa,Lb;ElemTypee1,e2;printf"头插法逆位序建表";CreateList&La,n;/*逆位序输入n个元素的值*/printf"La=";/*输出链表La的内容*/PrintlinklistLa;printf"";printf"按尾插法正序建表:";CreateList2&Lb,n;/*逆位序输入n个元素的值*/printf"Lb=";/*输出链表Lb的内容*/PrintlinklistLb;printf"";printf"输入插入的位置i=";scanf"%d",&i;printf"";printf"输入插入的元素e1=";scanf"%d",&e1;printf"";ListInsertLa,i,e1;printf"插入后La=";/*输出链表La的内容*/PrintlinklistLa;printf"";printf"输入删除的位置i=";scanf"%d",&i;printf"";ListDeleteLb,i,&e2;printf"删除后Lb=";/*输出链表La的内容*/PrintlinklistLb;printf"";printf"被删除的元素的值e2=%d",e2;printf。
    龚岳洲2019-12-21 19:39:18
  • 我把你的程序改好了,先复制在下面吧#include#include#include#define OK 1typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode * next;}LNode,* LinkList;void CreateList_LLinkList &L,int n//逆位序输入n个元素的值,建立带表头结点的单链线性表L{ int i;LNode * p;L=LinkListmallocsizeofLNode;L->next=NULL;//先建立一个带头结点的单链表fori=n;i>0;--i{ p=LinkListmallocsizeofLNode;//生成新结点printf"请输入第%d个结点的数据:",i;scanf"%d",&p->data;//输入元素值p->next=L->next;L->next=p;//插入到表头}}/*Status InitListLinkList &L { L=LinkListmallocsizeofLNode;    L->next=NULL;    return OK; }*/void MergeList_LLinkList &L1,LinkList &L2,LinkList &L3//已知单链线性表La和Lb的元素按值非递减排列{ LNode *pa, *pb, *pc;                    //归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列pa=L1->next;//printf"%d",pa->data;pb=L2->next;//printf"%d",pb->data;L3=L1;//用La的头结点作为Lc的头结点pc=L3;whilepa!=NULL && pb!=NULL{ ifpa->datadata{pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}pc->next=pa?pa:pb;//插入剩余段freeL2;//释放Lb的头结点}void Print_LLinkList &L//打印链表{   LNode *p;p=L->next;ifp==NULL{printf"该链表为空";}else{whilep!=NULL{printf"%-5d",p->data;p=p->next;}}printf"";}void main{ int m,n;    LinkList La, Lb, Lc;printf"请输入链表La中结点的个数:";scanf"%d",&m;printf"请输入链表La:";    CreateList_LLa,m;printf"链表La为:";Print_LLa;printf"请输入链表Lb中结点的个数:";scanf"%d",&n;printf"请输入链表Lb:";CreateList_LLb,n;printf"链表Lb为:";Print_LLb;// InitListLc;    MergeList_LLa,Lb,Lc;printf"链表Lc为:";Print_LLc;}自定义函数Print_L那里有一些问题,打印链表的时候不能移动头结点,否则归并的时候就找不到头结点了。可以定义一个指针变量p,用来移动到下一个节点。别的没什么问题了。运行结果如下,你也可以自己跑一下程序,就看到结果了。最后链表Lc也是有序的。
    龚宏辉2019-12-21 18:58:05
  • 用两个循环结构,拿出LB的第一个元素,然后遍历LA的元素,如果有相同的就存入LC中,然后再LB的第二个元素.......。
    连中连2019-12-21 18:42:06

相关问答

#include"stdio.h"#include"stdlib.h"#defineSTACK_INIT_SIZE10//栈的初始长度#defineSTACKINCREMENT5//栈的追加长度typedefstructbitree{chardata;structbitree*lchild,*rchild;}bitree;//二叉树结点定义typedefstruct{bitree**base;bitree**top;intstacksize;}sqstack;//链栈结点定义top栈顶base栈底且栈元素是指向二叉树结点的二级指针//建立一个空栈intinitstacksqstack*s{s->base=bitree*mallocSTACK_INIT_SIZE*sizeofbitree;//栈底指向开辟空间if!s->baseexit1;//抛出异常s->top=s->base;//栈顶=栈尾表示栈空s->stacksize=STACK_INIT_SIZE;//栈长度为开辟空间大小return1;}//进栈intpushsqstack*s,bitree*e{ifs->top-s->base>=s->stacksize//如果栈满追加开辟空间{s->base=bitree*reallocs->base,s->stacksize+STACKINCREMENT*sizeofbitree;if!s->baseexit1;//抛出异常s->top=s->base+s->stacksize;//感觉这一句没用s->stacksize+=STACKINCREMENT;}*s->top=e;s->top++;//进栈栈顶后移return1;}//出栈intpopsqstack*s,bitree**e{ifs->top==s->basereturn0;//栈空返回0--s->top;*e=*s->top;//栈顶前移取出栈顶元素给ereturn1;}//取栈顶intgettopsqstack*s,bitree**e//去栈顶元素注意top指向的是栈顶的后一个{ifs->top==s->basereturn0;//所以s->top-1*e=*s->top-1;return1;}/*------------------------非递归-----先序建立二叉树----------------------------------*/bitree*createprebitree{charch;bitree*ht,*p,*q;sqstack*s;s=mallocsizeofbitree;//加上这一句为s初始化开辟空间ch=getchar;ifch!=''#''&&ch!=''\n''/*输入二叉树先序顺序是以完全二叉树的先序顺序不是完全二叉树的把没有的结点以#表示*/{ht=bitree*mallocsizeofbitree;ht->data=ch;ht->lchild=ht->rchild=NULL;p=ht;initstacks;pushs,ht;//根节点进栈whilech=getchar!=''\n''//算{ifch!=''#''{q=bitree*mallocsizeofbitree;//法q->data=ch;//ifp==*s->top-1p->lchild=q;//核elsep->rchild=q;//pushs,q;p=q;//心}//else{ifp==*s->top-1p->lchild=NULL;//的elsep->rchild=NULL;//pops,&p;}//步//}//骤returnht;}elsereturnNULL;}/*--------------------------递归---------先序建立二叉树-------------------------------*/voidCreateBiTreebitree**T{//按先序次序输入二叉树中的结点的值,空格字符表示空树,//构造二叉链表表示二叉树charch;scanf"%c",&ch;ifch==''#''*T=NULL;else{*T=bitree*mallocsizeofbitree;if!*Texit1;*T->data=ch;//生成根结点CreateBiTree&*T->lchild;//构造左子树CreateBiTree&*T->rchild;//构造右子树}}/*--------------------------非递归-------中序建立二叉树-------------------------------*//*--------------------------递归---------中序建立二叉树-------------------------------*//*--------------------------非递归-------后序建立二叉树-------------------------------*//*--------------------------递归---------后序建立二叉树-------------------------------*//*-----------------------非递归------先序输出二叉树------------------------------*/voidpreordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;printf"%c",h->data;h=h->lchild;}else{pop&m,&h;h=h->rchild;}}}/*------------------------非递归-----中序输出二叉树----------------------------*/voidinordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;h=h->rchild;}}}/*---------------------非递归----后序遍历二叉树----------------------------------*/voidpostordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{bitree*r;//使用r结点表示访问了右子树代替标志域gettop&m,&h;ifh->rchild&&h->rchild!=r{h=h->rchild;push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;r=h;h=NULL;}}}}//层次遍历二叉树用队列哈哈以后做/*-------------------------------主过程-------------------------------*/intmain{bitree*ht;printf"先序非递归建立一个二叉树:";ifht=createprebitree!=NULL//非递归建立//CreateBiTree&ht;//ifht!=NULL//递归建立{printf"先序遍历输出二叉树:";preordertraverseht;putchar''\n'';printf"中序遍历输出二叉树:";inordertraverseht;putchar''\n'';printf"后序遍历输出二叉树:";postordertraverseht;putchar''\n'';}elseprintf"空二叉树\n";}这是先序递归和非递归建立二叉树和先、中、后的遍历输出。