链表的创建,增添,删除,及代码详解

kmp的学习告一段落了,现在回顾一下前段段时间学习的链表,链表一开始接触的时候我也是很难理解他,特别是链表与指针和结构题掺和在一起,对于初学者来说可能一时间有点难以接受,其实真真学起来之后,你就会发现其实链表的操作也并不是太难。好了下面来讲一些链表的基础知识,看了之后相信你对链表一定会有一个新的认识。

最好理解的就是拿代码来解释,一些基础知识都是在代码中介绍到的。

代码如下:

#include<stdio.h>
#include<stdlib.h>//链表中申请空间所必要头文件
struct node
{
	int date;
	struct node *next;
};
typedef struct node lnode, *linklist;//这里是为了简化代码
/*创建链表,此处用的是尾插法创建的链表,尾插和头插最大的区别就是用尾
插法创建的链表输出的数与你插入的顺序相同,而头插法则与之相反*/
void createlist(linklist head)
{
	/*定义两个指针p和rear,并让rear指向了head
	,还可以说是把head的地址给了rear,不过在链表里常说是前一种*/
	linklist p,rear=head;
	int num;
	while(scanf("%d",&num),num!=-1)
	{
		/*首先申请一个内存空间*/
		p=(linklist)malloc(sizeof(lnode));
		/*将输入的数放入链表的数据域,链表是由多个内存空间连接而成
		,每个内存空间分为,数据域用来存放数据,还有一个就是后继指
		针,用来连接两个内存空间的*/
		p->date=num;
		rear->next=p;/*让rear的后继指针指向新增节点*/
		rear=p;//跟新rear的地址,以便连接所有新增节点,构成一个链表
	} 
	rear->next=NULL;//这个地方很重要,不能丢掉,初学者很容易忘掉写这个
}
//打印链表
void printflist(linklist head)
{
	//定义一个遍历链表的指针并让他从链表的头部开始遍历
	linklist t=head->next;
	while(t)//t不为空,这里你明白为什么尾插法后面要求让最后一个节点的后继指针指向空。
	{
		printf("%d ",t->date);//输出每个节点存储的数据
		t=t->next;//跟新t 
	}
}
//链表中节点的删除
void listdelete(linklist head,int i)
{
	/*如果无法理解就想象成一列火车,你要去掉一节车厢的步骤,这样对你
	理解链表中节点删除会有所帮助*/
	linklist t=head,p;
	int j=1;
	/*i表示要删除节点的位置,这样做的目的就是找到要删除节点的前一个
	节点*/
	while(t&&j<i)
	{
		t=t->next;
		j++;
	}
	if(!t||i<1)//如果链表结束,或i<1就结束此时输入的i有误
	return;
	t->next=t->next->next;
}
//新增节点
void listinsert(linklist head,int i,int a)
{
	linklist p,t=head;
	int j=1;//看了链表中节点的删除,现在讲链表中节点的增添
	/*这跟链表的删除一样都是要找到要删除节点,或找到要增添节点的
	前一个节点*/
	while(t&&j<i)
	{
		t=t->next;
		j++;	
	}
	if(!t||i<1)
		return;
	p=(linklist)malloc(sizeof(lnode));
	p->date=a;//将要增添的数放入新增节点数据域
	p->next=t->next;//让p的后继指针指向要添加节点位置
	t->next=p;//让原本指向要增添节点的指针指向新增节点,这样就成功添加了一个节点
}
int main()
{
	linklist head;
	int i,e,select,n;
	head=(linklist)malloc(sizeof(lnode));
	head->next=NULL;
	printf("1:创建链表\n");
	printf("2:在链表中插入元素\n");
	printf("3:删除元素\n");
	printf("4:输出链表的元素\n");
	while(1)
	{
		scanf("%d",&select);
		switch(select)
		{
			case 1:
				createlist(head);
				break;
			case 2:
				scanf("%d",&i,&e);
				listinsert(head,i,e);
				break;
			case 3:
				scanf("%d",&i);
				listdelete(head,i);
				break;
			case 4:
				printflist(head);
				printf("\n");
				break;
		}
	}
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值