1. 程式人生 > >單鏈表 簡單題(單鏈表基本操作)

單鏈表 簡單題(單鏈表基本操作)

題目描述:

有一個帶頭結點的單鏈表L=(a1,b1,a2,b2,......an,bn),設計一個演算法將其拆分成兩個帶頭結點的單鏈表L1和L2,其中L1=(a1,a2,a3...an),L2=(b1,b2,b3....bn),要求L1使用L的頭結點。

解題思路:

利用原單鏈表L中的所有節點通過改變指標域重組成兩個單鏈表L1和L2,由於L1中節點的相對順序與L中的相同,所以採用尾插法建立單鏈表L1,由於L2中節點的相對順序與L中的相反,所以採用頭插法建立單鏈表L2。

解題要點:

該題考察單鏈表的基本操作,靈活運用並掌握單鏈表的基本運算。

C++程式碼實現:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct LNode
{
    int data;
    struct LNode *next;
}LinkNode;
void split(LinkNode *&L,LinkNode *&L1,LinkNode *&L2)    //  主要運算
{
    LinkNode * p=L->next,*q,*r1;
    L1=L;
    r1=L1;
    L2=(LinkNode *)malloc(sizeof(LinkNode));     //   初始化
    L2->next=NULL;
    while(p!=NULL)
    {
        r1->next=p;
        r1=p;
        p=p->next;
        q=p->next;
        p->next=L2->next;
        L2->next=p;
        p=q;
    }
    r1->next=NULL;
}
/*void CreateListF(LinkNode *&L,int a[],int n)  // 頭插法
{
    LinkNode *s;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        s->next=L->next;
        L->next=s;
    }
}*/
void CreateListR(LinkNode *&L,int a[],int n)       // 尾插法
{
    LinkNode *s,*r;
    L=(LinkNode *)malloc(sizeof(LinkNode));
    r=L;
    for(int i=0;i<n;i++)
    {
        s=(LinkNode *)malloc(sizeof(LinkNode));
        s->data=a[i];
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
void DispList(LinkNode *L)      //  輸出函式
{
    LinkNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    int a[100],n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    LinkNode *L,*L1,*L2;
    //CreateListF(L,a,n);   // 頭插法
    CreateListR(L,a,n);     // 尾插法
    split(L,L1,L2);
    DispList(L1);       //   輸出L1
    DispList(L2);    //   輸出 L2
    return 0;
}