c语言实现单链表的就地逆置

` 有几个需要注意的地方

  • 为链表赋值不要用头插法,头插法先插入的结点后输出,不用你去逆置,输出的时候就会逆序输出了
  • 遍历输出链表结点不要用移动头指针去遍历,应为头指针有定位链表作用,应该另外设置一个指针去遍历
  • List item
    #include
    #include
    #define ERROR 0;
    #define OK 1;
    typedef int ElemType;
    typedef int Status;
    typedef struct LNode{
    ElemType data;
    struct LNode *next;
    }LNode,LinkList;
    //创建空链表,由于链表所占用的空间可以不连续,可以不用判断是否分配成功
    Status InitLinkList(LinkList &L)
    {
    //生成一个新节点作为头结点,头指针指向头结点,头结点指针域置空
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    return OK;
    }
    //给链表各元素赋值,即生成新结点
    Status assign(LinkList &L,int n)
    {
    int i,e;
    LinkList u=L;
    for(i=0;i {
    //创建一个结点,让s指向它,注意是用尾插法,用头插法相当于在赋值的过程中逆置了
    LNode
    s=(LinkList)malloc(sizeof(LNode));
    printf(“请输入元素值”);
    scanf("%d",&e);
    s->data=e;
    //插入到新结点后面
    s->next=NULL;
    u->next=s;
    u=s;
    }
    return OK;
    }
    //逆置算法
    Status reverse(LinkList &L)
    {
    LinkList p,q;
    p=L;
    p=p->next;
    L->next=NULL;
    //将结点依次插到头结点后面
    while(p!=NULL)
    {
    q=p;
    p=p->next;
    q->next=L->next;
    L->next=q;
    }
    LinkList t=L->next;
    for(int i=0;i<5;i++)
    {
    printf("%d",t->data);
    printf("\n");
    t=t->next;
    }
    return OK;
    }
    int main()
    {
    LinkList L1;
    InitLinkList(L1);
    int m;
    printf(“链表元素个数为”);
    scanf("%d",&m);
    assign(L1,m);
    reverse(L1);
    }

你可能感兴趣的:(c语言实现单链表的就地逆置)