数据结构之单链表

//结点和单链表的描述

typedef int ElemType;
typedef struct  Node {
      ElemType      data;  // 数据域
      struct Node   *next;  // 指针域
   } LNode, *LinkList;  

LinkList  L;  // L 为单链表的头指针

头插法创建链表

LinkList Create_LinkListF(int n)
{
    LinkList L,s;
    int i,x;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    for(i=1;i<=n;i++)
  {
            printf("请输入第%d个数:",i);
            scanf("%d",&x);
            s=(LinkList)malloc(sizeof(LNode));
            s->data=x;
            s->next=L->next;
            L->next=s;
    }
    return L;
}

尾插法创建链表

//尾插法创建链表


LinkList Create_LinkListR(int n)
{
    LinkList L,s,r;
    int i,x;
    L=(LinkList)malloc(sizeof(LNode));
    r=L;
    for(i=1;i<=n;i++)
  {
            printf("请输入第%d个数:",i);
            scanf("%d",&x);
            s=(LinkList)malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
    }
    r->next=NULL;
    return L;
}

求长度

//求长度


int Length_List(LinkList L)
{ LinkList p;
int j=0; p=L->next; while(p)
  {   j
++;   p=p->next; } return j; }

定位操作//定位操作



(LinkList L, int i, ElemType *e) 
{
// L是带头结点的链表的头指针,以 e 返回第 i 个元素 p = L->next;
j = 1; // p指向第一个结点,j为计数器 while (p && j<i)
{
  p = p->next;
 ++j;
}
// 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空 if ( !p || j>i ) return ERROR; // 第 i 个元素不存在 *e = p->data; // 取得第 i 个元素 return OK; } // GetElem

按值查找

LinkList Locate(LinkList L,int key)
{
    LinkList p=L–>next;
    while( p && p–>data!=key)
    p=p–>next;
    return p;
} 

 插入操作

//插入操作

Status ListInsert(LinkList L, int i, ElemType e)

{

// L 为带头结点的单链表的头指针,本算法

// 在链表中第i 个结点之前插入新的元素e

  p = L;

  j = 0;

while (p && j < i-1)

{

  p = p->next;

  ++j;

} // 寻找第 i-1 个结点

if (!p || j > i-1)

  return ERROR; // i 大于表长或者小于1 ……

} // LinstInsert

 

删除操作

//删除操作


Status ListDelete_L(LinkList L, int i, ElemType &e) 
{
   // 删除以 L 为头指针(带头结点)的单链表中第 i 个结点
    p = L;    j = 0;
    while (p->next && j < i-1)
    {
          p = p->next; 
          ++j; 
    } // 寻找第 i 个结点,并令 p 指向其前趋

    if  (!(p->next) || j > i-1) 
        return ERROR;  // 删除位置不合理

    q = p->next;
    p->next = q->next;  // 删除并释放结点
    e = q->data; 
    free(q);
    return OK;

 } // ListDelete_L

清空

//清除


void ClearList(Linklist L) 
{
   // 将单链表重新置为一个空表
        while (L->next) 
    {
        p=L->next;
        L->next=p->next;
        free(p);
    }
} // ClearList

 

posted @ 2017-05-18 11:31  该☆隐  阅读(202)  评论(0编辑  收藏  举报