數據結構_在一個鏈表中刪除一段插入另一鏈表

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node, *Linklist;
Linklist newlist()//構建一個鏈表
{
    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; //逆序構建鏈表
        p->next = L->next;//逆序構建鏈表
        L->next = p;//逆序構建鏈表
       
 // p->data=x;
 // r->next=p;
 // r=r->next;
    }
  //  r->next=NULL;
    return L;
}
Linklist Operationlist(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;//新的鏈表la
    qa->next = pb->next;//新的鏈表lb
    pb->next = qb;
    return Lb;
}
Linklist Mergelist_L(Linklist &La,Linklist &Lb,Linklist &Lc)//歸併
{
 Node *pa,*pb,*pc;
 pa=La->next; pb=Lb->next;
 Lc=pc=La;
 while(pa&&pb)
 {
  if(pa->data<=pb->data)
  {
   pc->next=pa;
   pc=pa;
   pa=pa->next;
  }
  else
   {
   pc->next=pb;
   pc=pb;
   pb=pb->next;
     }
 }
 pc->next=pa?pa:pb;
 free(Lb);
 return Lc;
}
int main()
{
    Node *la, *lb, *p,*a,*b,*c;
    int i, m, j;
    printf("input LA data: \n");
    la = newlist();
    printf("input LB data: \n");
    lb = newlist();
    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);
    Operationlist(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");
    free(la); //釋放鏈表
    free(lb); //釋放鏈表
    //歸併函數調用
    a=newlist();
    b=newlist();
    Mergelist_L(a,b,c);
    for (p = c->next; p != NULL; p = p->next)
        printf("%d  ",p->data);
        printf("\n");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章