线性表之单链表(含头结点)

单链表:建立、插入、查询、删除、打印输出。

/**
 * ----线性表之链表----
 * 1.新建链表
 *  (1)头插法:将元素插到头结点之后
 *  (2)尾插法:将元素插到最后一个结点
 * 2.新增元素
 * 3.删除
 * 4.查询
 */
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode{
    ElemType data;//数据域
    struct LNode *next;//指针域
}LNode,*LinkList;
/**
 * ---头插法---
 * @param L
 */
void ListHearInsert(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));//为头结点申请内存空间
    L->next=NULL;
    ElemType x;//链表类型的变量
    scanf("%d",&x);//读取一个元素
    while(x!=00){
        LNode *s=(LinkList)malloc(sizeof(LNode));
        s->data=x;//将读入的元素存到新结点的数据域
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }

}
/**
 * ---尾插法--
 * @param L
 */
void ListTailInsert(LinkList &L){
    L=(LinkList)malloc(sizeof(LNode));
    LinkList r;//尾指针
    r=L;//初始时尾指针指向头结点
    LinkList s ;
    ElemType x;
    scanf("%d",&x);
    while(x!=00){
        s=(LinkList)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;//尾指针指向新结点
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
}
/**
 * ---按位置查找----
 * @param L
 * @param Postion
 * @return
 */
 LinkList SearchByBit(LinkList L,int Postion){
     if(Postion<0){
         return NULL;
     }
     int i=0;
     while(L && i<Postion){
         L=L->next;
         i++;
     }
    return L;
 }
 /**
  * ---按值查找----
  * @param L
  * @param RearchValue
  * @return
  */
 LinkList SearchByValue(LinkList L,ElemType RearchValue){
     while(L){
         if(L->data==RearchValue){
             return L;
         }
         L=L->next;
     }
     return NULL;
 }
 /**
  * ----在第i个位置插入元素---
  * @param L
  */
 bool ListInsertValue(LinkList L,int i,ElemType InsertValu){
      LinkList p;
      p= SearchByBit(L,i-1);
      if(p==NULL){
          return false;
      }
      LinkList q;
      q->data=InsertValu;
      q->next=p->next;
      p->next=q;
     return true;
  }
  /**
   * -----根据位置删除元素-----
   * p->    q
   * @param L
   * @param Position
   * @return
   */
  bool ListDeleteByBit(LinkList L,int position){
     LinkList p; //建立新的指针
     p = SearchByBit(L,position-1); //将指针p指向需要删除结点的直接前驱
     if(p==NULL){//判断p是否存在
         return false;
     }
     LinkList q; //新建新结点
     q=p->next;//将q指向需要删除的结点
     p->next=q->next;//将p指向需要删除的结点的直接后继
      free(q);//释放断链结点的内存空间
      return true; //返回真值
 }
  /**
   * ----打印输出----
   * @param L
   */
void ListPrint(LinkList L){
    L=L->next;
    while(L!=NULL){
        printf("%d",L->data);//打印当前结点数据
        L=L->next;//指向下一个结点
        if(L!=NULL){
        printf(" ");
        }
    }
    printf("\n");
}

int main() {
    LinkList L;//头指针
    //头插法
//    ListHearInsert(L);
//    ListPrint(L);
    //尾插法
    ListTailInsert(L);
    ListPrint(L);
    //删除--根据位置
    bool ret;
    ret=ListDeleteByBit(L,3);
    if(ret){
        ListPrint(L);
    } else{
        printf("false\n");
    }
    LinkList research;
    //按位置查找
    research= SearchByBit(L,2);
    if(research!=NULL){
        printf("%d\n",research->data);
    } else{
        printf("fasle.\n");
    }
    //按值查找
    research = SearchByValue(L,3);
    if(research!=NULL){
        printf("%d\n",research->data);
    } else{
        printf("fasle.\n");
    }
    //在第i个位置插入元素
    printf("Insert value.\n");
    ListInsertValue(L,3,88);
    ListPrint(L);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值