链表倒转等操作完整程序

 写一个链表的的操作的例子,虽然没什么难度,但是好久没写了,练练手。

 

#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);        //打印输出
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值