将一个链表删除一段,并插入另一个链表中
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
[解决办法]
#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;}