单链表的倒置算法

单链表是线性表的一种链式存储,属于线性结构,是通过指针来实现链式存储的,比之以顺序表,其存储密度更低,但是在插入,
删除操作上,其效率比顺序表要高;
(一)单链表的结构
   typedef struct Node
{
    DataType data;
    struct Node *next;
}LNode,*LinkList;
(二)单链表上的基本运算实现
(1)建立不带头结点的单链表
     (a)从头部插入(与读入数据顺序相反)
      #define flag 0
LinkList Creat_LinkList()
{
    LinkList L;
    LNode *s;
    L=NULL;
    int x;
    scanf("%d",&x);
    while(x!=flag)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        s->next=L;
        L=s;
        scanf("%d",&x);
    }
    return L;
}
   (b)从尾部插入(与读入数据顺序相同)
      #define flag 0
LinkList Creat_LinkList()
{
    LinkList L;
    LNode *s,*r;
    L=r=NULL;
    int x;
    scanf("%d",&x);
    while(x!=flag)
    {
         s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        if(L==NULL)
            L=s;
        else
            r->next=s;
        r=s;
        scanf("%d",&x);
    }
    if(r)
          r->next=NULL;
    return L;
}
(2)求表长
     (a)带头结点
      int Length_LinkList(LinkList L)
{
    int i=0;
    LNode *p;
    p=L;
    while(p->next)
     {
          p=p->next;
         i++;
    }
    return i;
}
    (b)不带头结点
      int Length_LinkList(LinkList L)
{
    int i=0;
    LNode *p;
    p=L;
    while(p)
    {
          i++;
          p=p->next;
    }
    return i;
}
#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
typedef
int DataType;
#define flag 0
typedef
struct Node
{
DataType data;
struct Node *next;
}LNode,
*LinkList;//定义单链表
LNode
*Creat_LinkList()//创建带头结点的单链表
{
LinkList L;
int x;
LNode
*s,*r;
s
=(LNode *)malloc(sizeof(LNode));
s
->next=NULL;
L
=r=s;
scanf(
"%d",&x);
while(x!=flag)
{
s
=(LNode *)malloc(sizeof(LNode));
s
->data=x;
if(L->next==NULL)
L
->next=s;
else
r
->next=s;
r
=s;
scanf(
"%d",&x);
}
if(r!=NULL)
r
->next=NULL;
return L;
}
LinkList reverse(LinkList L)//单链表的倒置算法
{
LNode
*p,*q;
p
=L->next;
L
->next=NULL;
while(p)
{
q
=p;
p
=p->next;
q
->next=L->next;
L
->next=q;
}
return L;
}
int main()
{
LinkList H;
H
=Creat_LinkList();
LNode
*p;
p
=H->next;
while(p)
{
printf(
" %d",p->data);
p
=p->next;
}
printf(
"\n");
LinkList S;
S
=reverse(H);
LNode
*q;
q
=S->next;
while(q)
{
printf(
" %d",q->data);
q
=q->next;
}
printf(
"\n");
system(
"pause");
return 0;
}

你可能感兴趣的:(单链表)