链表的基本插入删除转置

单链表的实现函数

#ifndef _LINKLIST_H_

#define _LINKLIST_H_

#include <stdio.h>

#include <stdlib.h>

typedef int datatype;

typedef struct node_t

{

datatype data;//数据域

struct node_t *next;//指针域,指向自身结构体的指针

}link_node_t,*link_list_t;

创建一个有头单向链表

link_node_t *CreateEpLinkList()
{
	link_node_t *h = (link_list_t)malloc(sizeof(link_node_t));
	if(NULL == h)
	{
		printf("h malloc failed\n");
		return NULL;
	}

	h->next = NULL;
	return h;
}

遍历无头

while(p!=NULL)
{
    printf("%d",p->data);
       p=p->next;

}

遍历有头

while(p->next!=NULL)
{
    
       p=p->next;
    printf("%d",p->data);
}

链表插入

解题思想:

1、先遍历找到要插入节点的前一个节点,假设这个节点为A;A的下一个节点为B;

将C插入A与B之间;

2、先让C的指针域指向B;

3、再让A的指针域指向C;

注意:顺序不可以调换

int insert_linklist(link_node_t *p,int post,int data)
{
    link_node_t *pnew= (link_list_t)malloc(sizeof(link_list_t));
    if(NULL==pnew)
    {
        printf("失败");
            return -1;
    }
    pnew->data=data;
    pnew->next=NULL;
    int i;
    for(i=0;i<post;i++)
    {
        p=p->next;



    }
        pnew->next=p->next;
        p->next=pnew;


        return 0;

}

链表指定位置删除

解题思想:

1、先遍历找到要删除节点的前一个节点,假设为A;

2、找一个临时指针指向要删除的节点;

3、将A的指针域指向删除节点的下一个节点;

int del_linklist(link_node_t * p,int post)
{
    int i;
        for(i=0;i<post;i++)
        {
            p=p->next;
        }
        link_node_t *pdel=NULL;
        pdel=p->next;
        p->next=pdel->next;
            free(pdel);
            pdel=NULL;
        return 0;

链表逆序

解题思想:

1、将头节点与当前链表断开,断开前保存头节点的下一个节点,保证后面链表能找得到,定义一个q保存头节点的下一个节点,断开后前面相当于一个空的链表,后面是一个无头的单向链表

2、遍历无头链表的所有节点,将每一个节点当做新节点插入空链表头节点的下一个节点(每次插入的头节点的下一个节点位置)

void ReverseLinkList(link_node_t *p)

void turn_linklist(link_node_t *p)
{
    link_node_t *q=NULL;
    link_node_t *temp=NULL;
    p->next=NULL
    while(p!=NULL)
    {
        temp=q->next
        q->next=p->next;
        p->next=q;
            q=temp;



     }

总结:顺序表和单向链表比较(****)

1、顺序表在内存当中连续存储的(数组),但是链表在内存当中是不连续存储的,通过指针将数据链接在一起

2、顺序表的长度是固定的,但是链表长度不固定

3、顺序表查找方便(下标),但是插入和删除麻烦(post~last),链表,插入和删除方便,查找麻烦

(为什么操作麻烦,为什么操作方便?)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值