读书人

将一个链表删除一段并插入另一个链表

发布时间: 2012-04-05 12:42:40 作者: rapoo

将一个链表删除一段,并插入另一个链表中
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;} 

读书人网 >软件架构设计

热点推荐