鏈表倒轉等操作完整程序

 寫一個鏈表的的操作的例子,雖然沒什麼難度,但是好久沒寫了,練練手。

 

#include<stdio.h>


typedef 
struct tagLinkNode                                         //定義一個節點結構體
{
    
char m_type;
    
struct tagLinkNode *next;

}
LinkNode;


LinkNode
* CreatLinkList(int n)        //創建鏈表的函數
{                                                    
                                                    
//L爲指向頭節點的指針
    LinkNode* L, *ptr, *p;        //p爲指向新申請內存空間的節點
                                                    
//ptr爲插入前驅節點
    int i;
                                                    
    L 
= (LinkNode*)malloc(sizeof(LinkNode));  //申請頭節點,並用L指向它
    L->next = NULL;                                                                               //初始化頭節點的next域
    L->m_type = '0';                                                                                                //將頭節點的m_type域設置爲'0'
                                                    
//以作爲標記

    ptr 
= L;                                                                                    //初始化前驅指針

    printf(
"輸入字母(每個字母以回車鍵作爲結束): ");

    
for(i = 0; i < n; i++)        //依次創建節點
    {
        p 
= (LinkNode*)malloc(sizeof(LinkNode));

        
if(p == NULL)            
        
{
            printf(
"malloc error!");
        }


        scanf(
"%c"&(p->m_type));
        fflush(stdin);                                                                                                
//刷新stdin

        p
->next = ptr->next;    //插入一個節點的算法
        ptr->next = p;
        ptr 
= p;
    }


    
return L;                                                                                                   //返回指向頭節點的指針
}


LinkNode
* RotateList(LinkNode* Head)                        //鏈表倒轉函數
{
    LinkNode 
*p1, *p2;                                //p2爲遊標指針
    LinkNode *= Head;

    p1 
= Head;
    p2 
= Head->next;

    
    
while(p2)                            //順次從鏈表中拿下一個節點然後分別插入到前面                                                    
    {
        p1
->next = p2->next;
        p2
->next = L;
        L 
= p2;
        p2 
= p1->next;
    }


    
return L;                                                                                //返回新的頭指針
}


void PrintLinkList(LinkNode* Head)                           //輸出鏈表的函數
{
    LinkNode 
*= Head;
    
    
    
if(p->m_type != '0')        //這是倒轉後的輸出
    {
        printf(
" 倒轉後爲: ");

        
while(p->m_type != '0')    //當遇到頭節點時停止輸出
        {
            printf(
"%c  ",p->m_type);
            p 
= p->next;
        }

    }

    
else                                                                  //這是倒轉前的輸出
    {
        printf(
" 顯示輸出爲: ");

        p 
= p->next;                                                                                                 //跳過頭節點
        while(p)
        
{
            printf(
"%c  ",p->m_type);
            p 
= p->next;
        }

    }

}


int main()
{
    
int n = 5;
    LinkNode 
*head;                                                                               //定義一個表頭指針                        

    head 
= CreatLinkList(n);        //創建鏈表
    PrintLinkList(head);        //打印輸出
    head = RotateList(head);        //倒轉鏈表
    PrintLinkList(head);        //打印輸出
}


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