C // 單鏈表的創建、遍歷以及逆置操作

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int data;
    struct node *next;
}Node;

Node* CreatList()//新建鏈表
{
    int n,i;
    scanf("%d",&n);
    Node *head,*tail,*p;
    head=tail=NULL;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    for(i=1;i<=n;i++)
    {
        p=(Node *)malloc(sizeof(Node));//在鏈表建立過程中,p總是不斷先接受系統動態分配的新結點地址
        scanf("%d",&p->data);
        p->next=NULL;//由於新增加的節點總是加在鏈表的末尾,所以該新節點的next域應置爲NULL
        if(head==NULL)//建立鏈表的第一個節點時,整個鏈表是空的,這時p應該直接賦給head
            head=p;
        else
            tail->next=p;//將原來鏈表的尾節點的next域指向該新增的節點
        tail=p;//該新增節點成爲新的尾節點
    }
    return head;
}
void ShowList(Node *head)//遍歷鏈表
{
    Node *ptr;
    if(head!=NULL)
    {
        for(ptr=head;ptr!=NULL;ptr=ptr->next)//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            printf("%d ",ptr->data);
    }
    printf("\n");
}
Node *ReverseList(Node *head)//逆置列表
{
    Node *p,*q;
    p=head->next;
    while(p)
    {
        q=p;
        p=p->next;//p用來向後移動位置

        q->next = head->next ;//利用head->next的空間作爲地址中轉站,令q->next指向上一個q所在的位置
        if(q->next==q)//確保原來第二個節點指向原來的第一個節點
            q->next=head;
        head->next = q ;
    }
    head->next=NULL;
    return q;
}

int main(void)
{
    Node *phead;
    phead = CreatList();
    printf("鏈表逆置前的數據:\n");
    ShowList(phead);
    phead = ReverseList(phead);
    printf("鏈表逆置後的數據:\n");
    ShowList(phead);
    return 0;
}

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