单链表

链表中的每个结点只有一个指针域,我们将这种链表称为单链表。 
头指针(head):指向链表第一个结点。
最后一个结点指针域为空。
结点可以连续存储,也可以不连续存储.
结点的逻辑顺序与物理顺序可以不一致.
 
//单链表的存储结构描述
typedef struct Node // 结点类型定义
{
    //ElemType 具体类型据实际设定, 如int,char等
    ElemType data;
    struct Node * next; 
}Node, *LinkList;//LinkList为结构指针类型
 
//初始化单链表
InitList(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
}
 
//头插法
void CreateFromHead(LinkList L)
{
    Node *s;
    int flag=1;//标志--初值为1,当输入‘$’时,flag为0,建表结束
    while(flag)
       { c=getchar();//接收一字符
         if(c!=’$’) //如果字符不是‘$’,则执行头插
            {
                s=(Node *)malloc(sizeof(Node));
                s->data=c;
                s->next=L->next;
                L->next=s;
            }
        else
           flag=0;
     } 
}
 
//尾插法
void CreateFromTail(LinkList L)
{
      Node *r, *s;
      int flag=1;//标志--初值为1,当输入“$”时,flag为0,建表结束
      r=L;
      while(flag)
         { c=getchar();//接收一字符
           if(c!=’$’) //如果字符不是’$’,则执行尾插
               {
                  s=(Node *)malloc(sizeof(Node));
                  s->data=c;
                  r->next=s;
                  r=s;
               }
         else
            {
                 flag=0;
                 r->next=NULL;
             }
         } 
}
 
//单链表插入操作
void InsList(LinkList L,int i,ElemType e)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
      Node *pre,*s;
      int k;
      if(i<1) return Error;
         pre=L; k=0;
     while(pre!=NULL&&k<i-1)
           { pre=pre->next; k=k+1; }
      if(!pre)
          { printf(“插入位置不合理!”); return Error; }
      s=(Node*)malloc(sizeof(Node)); //为e申请一个新的结点
      s->data=e; /*将待插入结点的值e赋给s的数据域*/
      s->next=pre->next;
      pre->next=s;
     return OK;
}
 
//单链表删除
void DelList(LinkList L,int i,ElemType *e)
{
     Node *pre,*r;
     int k;
     pre=L; k =0;
     while(pre->next!=NULL&&k<i-1)
        { pre=pre->next; k=k+1; }
    if( !(pre->next) )
        {
             printf(“删除结点的位置i不合理!”);
            return ERROR;
         }
    r=pre->next;
    pre->next=pre->next->next /*删除结点r*/
    e = r->data;
    free(r); return OK;
}
 
//按序号查找
Node * Get(LinkList L, int i)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
{
     int j;
     Node *p;
     if(i<=0)
     return NULL;
     p=L;j=0; / * 从头结点开始扫描 * /
     while ( (p->next!=NULL)&&(j<i) )
        { p=p->next;
          j++;
        }
     if(i= =j)return p; / * 找到了第i个结点 * /
     else return NULL; / * 找不到,i>n * /
}
 
//按值查找
Node *Locate( LinkList L,ElemType key)/ * 在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL * /
{    Node *p;
     p=L->next; / * 从表中第一个结点比较 * /
     while (p!=NULL)
     if (p->data!=key)
        p=p->next;
     else
          break; / * 找到结点key,退出循环 * /
     return p;
}
 
//单链表的长度
int ListLength(LinkList L) /*L为带头结点的单链表*/
{
    Node *p;
    p=L->next;
    j=0; /*用来存放单链表的长度*/
    while(p!=NULL)
      { p=p->next;
        j ++;
      }
    return j;
}
原文地址:https://www.cnblogs.com/lxzw/p/12890827.html