链表的常见用法

本文详细介绍了链表的基本操作,包括定义、创建、查找、求表长、插入、删除和输出。通过示例展示了头插法、尾插法、按值查找、按序号查找等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、定义

链表的头文件:

 #include< stdlib>

链表的建立:

struct LinkList
{
      int data;
      struct LinkList *next;
}

二、创建

头插法:

//头插法建立带头结点的单链表
LinkList create1(LinkList &L){
  LinkList *s;
  int x; 
  L=(LinkList*) malloc( sizeof(LinkList));//创建头结点
  L->next = NULL; //初始化
  printf("往链表中添加数据,99999结束\n");
  scanf("%",&x);
  while(x!=99999){
      s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
      s->data = x;
      s->next = L->next;
      L->next = s;
      scanf("%d",&x);
  }
return L;
}

尾插法:

//尾插法建立单链表
LinkList create2(LinkList &L){
    int x;
    L=(LinkList*) malloc( sizeof(LinkList ));//创建尾结点
    LinkList *s,*r = L;//S为插入节点指针,r为尾指针
    printf("往链表中添加数据,99999结束\n");
    //scanf("%",&x);
    while(x!=99999){
      s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
      scanf("%d",&x); 
      s->data = x;
      r->next = s;
      r = s; //r指向新的表尾
    }
    r->next = NULL;//尾节点指针置空
    return L;
}

三、查找

按值查找:

LinkList *locateElem(LinkList L, int e){
 LinkList *P = L->next;
    while (P!=NULL && P->data!=e){
      P = P->next;
    }
    return P;//失败则返回空指针
}

按序号查找:

LinkList *getElem(LinkList L, int i){
   int j = 1;
    LinkList *P = L->next;
    if(i == 0)
        return L;    //如果i=0,则返回头结点
    if(i < 0)
        return NULL;    //错误序号则返回NULL
    while(P && j<i)//P非空
    {
       P= P->next;
       j++;
    }
   return P;
}

四、求表长

void get_len( LinkList  *head )
{
      LinkList  *p = head->next ;
      int len = 0;
      while ( p )
      {
             len++;
             p = p->next;
      }
      head->data = len ; //存储长度到头结点
} 

五、插入

//插入节点算法(后插,前插一般不考虑)
//指定位置插入节点
int insertElem(LinkList L,int i,int e){
    if (i<=1 || i>getLength(L))
    {
	    return 0;
    }
    else
    {
	   LinkList *s,*p;
	   p = getElem(L,i-1);//获取插入位置前驱
	   s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
	   s->data = e;
	   s->next = p->next;//此句和下面那句代码不可颠倒,单链表只可找到后继,所以后继指针不能被先覆盖
	   p->next = s;
	   return 1;
    }
}

//插入节点算法2
//只交换数据,不改变指针,在已知节点位置的基础上这个是最优算法
int insertElem(LinkList L,int i,int e){
    int temp;
    if (i<=1 || i>getLength(L))
    {
 	  	 return 0;
    }
    else
    {
	   LinkList *s,*p;
	   p = getElem(L,i);//获取插入位置
	   s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
	   s->data = e;
	   s->next = p->next;
	   p ->next = s;
	    temp = p->data;//这里做个数据交换
	   p->data = s->data;
	   s->data = temp;  
	   return 1;
    }
}

六、删除

// 删除全部链表
void free_link ( LinkList   *h )
{
    LinkList   *p ;
    while ( h )
    {
        p = h ; //记下要释放的结点
        h = h->next ; //表头指针指向下一个结点
        free(p);//释放当前结点
    }
}

//删除指定的元素
LinkList *deletenode(LinkList *head,int m){
	LinkList *p,*q,*s;
	p = head;
	q = head->next;
	while(q){
		if(q->data == m){
			p->next = q->next;
			s = q;
			q = q->next;
			free(s); 
		}else{
			p = p->next;
			q = q->next;
		}
	}
	return head;
} 

七、输出

void output (LinkList  *h )
{
    LinkList  *p = h->next ; //p指向第一个数据结点
    while ( p )
    {
        printf("data=%d\n" , p->data ); //输出结点数据
        p = p->next ; //数据指针指向下一个结点
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值