单链表

    单链表是线性表的一种链式存储结构,属于线性结构,是通过指针来实现链式存储的,相比顺序表,存储密度更低,针对插入、删除等操作,其效率更高。

        相比线性结构,单链表需要提高效率,则需要针对每一个元素,可以不连续存储,但是必须知道其后继元素的地址。

        因此,对于任一数据元素在存储其自身的信息(数据信息)外,还需要存储其后继信息(其后继的存储地址)。

        因此,便产生构成单链表的结点,其由存储元素信息的数据域和存储后继位置的指针域组成。

    头指针:单链表中第一个结点的存储位置。

    头结点:单链表的第一个结点前附设一结点。

    最后一个结点,无后继,则其指针域为空。

(一)单链表的结构
 
  typedef struct Node
 {
    DataType data;
    struct Node *next;
 }LNode,*LinkList;

(二)单链表上的基本运算实现

(1)建立不带头结点的单链表

(a)从头部插入(与读入数据顺序相反

    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)从尾部插入(与读入数据顺序相同)
    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;
}

讨论技术欢迎加群:翻转世界IT 386707638
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值