日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

交換單鏈表第n和n+1個鏈點

作者:愛吃土豆的馬鈴薯21 更新時間: 2022-07-13 編程語言

交換單鏈表第n和n+1個鏈點

帶頭結點的單鏈表,頭指針為h,編寫算法,實現單鏈表中第n個結點和第n+1個結點相互交換,如果n為尾結點,需要向用戶輸出提示信息,代表交換失敗,返回0,若交換成功返回1,并打印交換后的單鏈表。

這個題主要難點 :
1.判斷是否滿足有n+1個節點。
2. 交換這倆個節點的位置

該單鏈表的存儲結構

typedef int DataType;
typedef struct Node
{
    DataType data;      // data域用于存儲數據元素
    struct Node *next;  // next域用于存放指向其后繼的指針
}LNode, *PNode, *LinkList;  // LinkList為頭指針
// **初始化函數**
int InitLinkList(LinkList *head)   
{
    *head = (LinkList)malloc(sizeof(LNode));
    if (!head)
    {
        printf("初始化鏈表錯誤!\n");
        return 0;
    }
    (*head)->next = NULL;                            
    return 1;
}

// **求鏈表長度函數**
int LinkListLength(LinkList head)
{
    int length = 0;
    PNode p = head->next;
    while (p)
    {
        length++;
        p = p->next;
    }
    return length;
}

//**判斷鏈表是否為空函數**
int LinkListEmpty(LinkList head){
    if (head->next)    {
        return 0;
    }
    else {
        return 1;
    }
}

//**插入函數**
int LinkListInsert(LinkList h, int pos, DataType x)
{
    PNode p = h, q;
    int i = 0;
    while (p && i < pos- 1)
    {
        p = p->next;    
        i++;                                    
    }
    if (!p || i > pos - 1)                            
    {
        printf("插入位置不合法!\n");
        return 0;
    }
    q = (PNode)malloc(sizeof(LNode));
    if (!q)                                            
    {
        printf("不能生成新結點\n");
        return 0;
    }
    q->data = x;    
    q->next = p->next;
    p->next = q;    
    return 1;
}
// **摧毀鏈表函數**
void DestroyLinkList(LinkList h)
{
    PNode p = h->next;
    while (h)
    {
        p = h;
        h = h->next;
        free(p);
    }
}

//**遍歷鏈表函數**
void TraverseLinkList(LinkList h)
{
    PNode p = h->next;
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
// **用于和下面語句一起判斷交換是否成功**
// 其實這個函數可以不用直接在主函數中判斷即可
PNode findN(LinkList a,int n)
{
    int cnt = 1;
    PNode p = a;
    while( p  && cnt <= n )
        p = p->next;
        cnt++;
    return p;
}
// **交換鏈點位置函數**
int SwapN_inList( LinkList a , int posN , int *len)
{
    LinkList A , q,p;
    int n =1, num =0;
    A=a->next;
    while(A)  // 統計節點個數
    {
        num++;
        A = A->next;
    }
    *len = num;
    if(posN >= num) // 判斷是否滿足有n+1個節點
    {
        return 0;
    }
    A = a->next;
    while(1)
    { // 找到待交換節點
        if(n == posN-1)
        {
            q = A->next; //第n個節點
            p = q->next; // 表示第n+1個節點
            A->next = q->next;
            q->next = p->next;
            p->next = q;
            break;
        }
        n++;
        A = A->next;
    }
    return 1;
} 
// **主函數**
int main()
{
    LinkList h;
    char ch;
    PNode s1=NULL,s2=NULL,s3=NULL,s4=NULL;
    DataType x,N;
    int length = 0, pos = 1;
    InitLinkList(&h);
    do
    {
        scanf("%d",&x);
         LinkListInsert( h , pos++ , x );
    }while((ch=getchar())!='\n');
    scanf("%d",&N);        
    s1 = findN(h,N);
    if (s1)
    {
        s2 = s1->next;
    }
    if ( SwapN_inList( h , N , &length) == 1 )
    {    
        s3 = findN(h,N);
        if (s3)
        {
            s4 = findN(h,N+1);
        }        
        if ( s1 == s4 && s2 == s3 )
        {
            printf("交換第%d個和第%d個鏈點位置后的單鏈表A是\n", N , N+1 );
            TraverseLinkList( h );
        }
    }
    else
    {    
        printf("單鏈表A的第%d個結點為尾結點,沒有下一個結點與之交換\n", length);
    }
    DestroyLinkList( h );
    return 0;
}

原文鏈接:https://blog.csdn.net/smallcabbage12/article/details/125698661

欄目分類
最近更新