链表相关知识点

目录

单链表

单链表的创建

尾插法:​

尾插法(无表头)代码实现

尾插法(带表头)代码实现

头插法

头插法(带表头)代码实现

单链表的操作

插入操作

删除操作

遍历操作

特殊链表构建

尾插法(数组)

头插法(数组) :https://blog.csdn.net/qq_40636008/article/details/123732444?spm=1001.2014.3001.5501

常见错误


单链表

单链表的创建

  • 尾插法:

  • 尾插法(无表头)代码实现

//链表的创建(无表头)
List* createlist()
{
	List* head,* idx,*end;
	idx=new(List);
	head=idx;
	end=idx;
	while(1)
	{
		if(/*输入终止条件*/) break;
		
		else
		/* 输入数据 */
		
		end->next=idx;
		end=idx;
		idx=new(List);
	}
	end->next=NULL;
	return head;
}

int main()
{
    List *head=createlist();
}
  • 尾插法(带表头)代码实现

//链表的创建(带表头)
List* createlist()
{
	List* head,*idx,*end;
	head=new(List);
	end=head;
	while(1)
	{
		idx=new(List);
		if(/*输入终止条件*/) break;
		
		else
		/* 输入数据 */
		
		end->next=idx;
		end=idx;
	}
	end->next=idx;
	return head;
}

int main()
{
    List *head=createlist();
}

头插法

头插法(带表头)代码实现

List* createlist()
{
    List* head,*idx;
    head=new(List);
    head->next=NULL;
    
	while(1)
	{
		idx=new(List);
		if(/* 输入终止条件 */) break;
		
		else
		/* 输入数据 */
		
		idx->next=head->next;
		head->next=idx;
	}
	return head;
}

单链表的操作

插入操作

原理:先创建预插入节点idx的空间,然后找到p节点,令idx->next=p->next,p->next=idx;

list* insert(list* head,int k,int d)
{
    list *p=head;
    list *idx;
    idx=new(list);
    idx->data=d;
    if(k>n) return p;   /* 如果预插入p节点后的p大于当前链表长度,操作无效 */
    else if(k==0)       /* 如果插入在链表头插入 */
    {
        idx->next=p;
        p=idx;
        return p;
    }
    else
    {
        for(int i=0;i<k-1;i++) p=p->next;
        idx->next=p->next;
        p->next=idx;
    }
    n++;
    return head;
}

删除操作

原理:找到预删除节点k的上一个节点p,令p->next=p->next->next

list* remove(list* head,int k)
{
    list* p=head;
    if(k==0||k>n) return p;  /* 删除第0个节点或者删除超过链表长度的节点,操作无效 */
    else 
    {
        if(k==1) p=p->next;  /* 删除链表首节点 */
        else
        {
            for(int i=0;i<k-2;i++) p=p->next;  /* 找到预删除节点的上一个,可以用特殊值推一推 */
            p->next=p->next->next;
        }
        n--;
    }
    return head;
}

遍历操作

void bianli(List *head)
{
    for(List *p=head;p!=NULL;p=p->next)
    {
        /* 遍历时所要进行的操作 */
    }
}

特殊链表构建

尾插法(数组)

//链表的创建(数组+结构体:需要对链表进行某种排序时可用)
int main()
{
	int n;
	cin>>n;
	List a[500];
	for(int i=0;i<n;i++)
	{
		/* 输入数据 */
		
		a[i].next=&a[i+1];
	}
	
	/* 可用sort(a,n,cmp)对链表里的数据进行排序 */
	
	for(int i=0;i<n;i++)
	{
		a[i].next=&a[i+1];
	}
	/* 排序后需要重新建立链式关系 */
	
	a[n-1].next=NULL;
}

头插法(数组) :https://blog.csdn.net/qq_40636008/article/details/123732444?spm=1001.2014.3001.5501

常见错误

  • List *p=NULL时,却出现了p->data的操作
  • 已经delete p或free (p)后,却使用到了p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值