首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

将一个链表删除一段,并插入另一个链表中解决办法

2012-04-05 
将一个链表删除一段,并插入另一个链表中1 /* 已知有两个单链表A和B,其头指针分别为first和second,编写一个

将一个链表删除一段,并插入另一个链表中
1 /* 已知有两个单链表A和B,其头指针分别为first和second,编写一个算法,从单链表A中删除自第i个元素起的共m个元素,*/
  2 /*然后将它们插入到单链表B的第j个元素之前。 */
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 typedef int ElemType;
  6 typedef struct Node
  7 {
  8 ElemType data;
  9 struct Node *next;
 10 }Node,*Linklist;
 11 Linklist LinklistCreatT()
 12 {
 13 Node *L;
 14 L=(Linklist)malloc(sizeof(Node));
 15 L->next=NULL;
 16 Node *r;
 17 r=L;
 18 ElemType x;
 19 while(scanf("%d",&x)!=EOF)
 20 {
 21 Node *p;
 22 p=(Linklist)malloc(sizeof(Node));
 23 p->data=x;
 24 r->next=p;
 25 r=p;
 26 }
 27 r->next=NULL;
 28 return L;
 29 }
 30 Linklist LinklistDI(Linklist La,Linklist Lb,int i,int j)
 31 {
 32 Node *p,*q,*s; int m,n;
 33 p=La->next;
 34 q=Lb->next;
 35 m=1;
 36 while(p!=NULL&&m<i) {p=p->next; ++m;}
 37 if(p==NULL&&m>=i) exit(0);
 38 s=p->next;
 39 p->next=NULL; // 删除第i个元素及以后的元素  
 40 n=1;
 41 while(q!=NULL&&n<j) {q=q->next; ++n;}
 42 if(q==NULL&&n>=j) exit(0);
 43 Node *r; r=s; // 另外申请一个指针指向被删除链表的头指针
 44 while(s!=NULL) {s=s->next;} //s—>next=NULL 尾结点
 45 s->next=q->next; //这里有错误,why??
 46 q->next=r;
 47 return Lb;
 48 
 49 }
 50 void main()
 51 {
 52 Node *la,*lb,*lc; int i, j;
 53 printf("input LA data: \n");
 54 la=LinklistCreatT();
 55 printf("input LB data: \n");
 56 lb=LinklistCreatT();
 57 printf("input LA delete place : \n");
 58 scanf("%d",&i);
 59 printf("input LB insert place : \n");
 60 scanf("%d",&j);
 61 lc=LinklistDI(la,lb,i,j);
 62 
 63 Node *f;
 64 for(f=lc->next;f!=NULL;lc=lc->next)
 65 printf("%d",lc->data);
 66 
 67 }
 68 
~  
~  
~  
~  
~  
~  
~  
~  
~  
   




[解决办法]
貌似楼主的代码没有实现删除自第i个元素起的共m个元素,删除时候也没有free
[解决办法]

C/C++ code
#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct Node{    ElemType data;    struct Node *next;} Node, *Linklist;Linklist LinklistCreatT(){    Node *L, *r, *p;    ElemType x;    L = (Linklist)malloc(sizeof(Node));    L->next = NULL;    r = L;    while (scanf("%d", &x) != EOF)    {        p = (Linklist)malloc(sizeof(Node));        p->data = x;        r->next = p;        r = p;    }    r->next = NULL;    return L;}void LinklistDelete(LinkList L){    Node *p = *L, *q;    while (p != NULL)    {        q = p;        p = p->next;        free(q);        q = NULL;    }}Linklist LinklistDI(Linklist La, Linklist Lb, int i, int m, int j){    Node *pa, *qa, *pb, *qb;    int cnt;    pa = La->next;    pb = Lb->next;    cnt = 1;    while (pa != NULL && cnt < i - 1)    {        pa = pa->next;        ++cnt;    }    if (pa == NULL || cnt > i - 1)    {        printf("LA delete wrong place\n");        return Lb;    }    qa = pa->next;    cnt = 1;    while (qa != NULL && cnt < m)    {        qa = qa->next;        ++cnt;    }    if (qa == NULL || cnt > m)    {        printf("LA delete too many datas\n");        return Lb;    }            cnt = 1;    while (pb != NULL && cnt < j - 1)    {        pb = pb->next;        ++cnt;    }    if (qa == NULL || cnt > j - 1)    {        printf("LB insert wrong place\n");        return Lb;    }            qb = pa->next;    pa->next = qa->next;    qa->next = pb->next;    pb->next = qb;    return Lb;}int main(){    Node *la, *lb, *p;    int i, m, j;    printf("input LA data: \n");    la = LinklistCreatT();    printf("input LB data: \n");    lb = LinklistCreatT();    printf("input LA delete place : \n");    scanf("%d", &i);    printf("input LA delete num : \n");    scanf("%d", &m);    printf("input LB insert place : \n");    scanf("%d", &j);    LinklistDI(la, lb, i, m, j);    printf("LA:\n");    for (p = la->next; p != NULL; p = p->next)        printf("%d  ",p->data);    printf("\n");    printf("LB:\n");    for (p = lb->next; p != NULL; p = p->next)        printf("%d  ",p->data);    printf("\n");    LinklistDelete(la);    LinklistDelete(lb);    return 0;} 

热点排行