单链表

来源:互联网 发布:淘宝机器人客户问题 编辑:程序博客网 时间:2024/06/02 19:27

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

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

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

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

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

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

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

(一)单链表的结构
 
  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 0typedef 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
0 0
原创粉丝点击