C语言对链表的基本操作(1、创建表 2、创建节点 3、表头插入 4、表尾插入 5、打印表)

1. 链表的结构体定义(结点定义)

链表的一个结点首先肯定包含一个数据域和一个指针域,数据域用来存放结点数据,指针域存放的是指向下一个结点的地址。当然,头节点例外,其实,头结点和普通结点一样,只不过头结点只存放了指向下一个结点的地址(即首结点)。

2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确

3、表头插入
//  插在头结点之后  插队插入,不能越过头结点
//  插队插入,不能越过头结点

只需要强调一点,头插法是在头结点尾部,尾插法是在链表尾部插入,这个不要理解错了。其实思想和尾插类似,只要记得插入是和头结点有关,

    newNode->next = headNode->next;

    headNode->next = newNode;

newNode始终是用来接收输入数据,然后插入头结点的尾部,headNode->next是头指针每次插入新节点之前,最近指向一次插入的结点。当新节点排队插入后,需要将新节点的next指向原先插入之前,距离头结点最接的结点  headNode->next

4.尾插法建立链表

这里,尾插法是在链表尾部插入结点的

所以先创建一个头结点,struct Node* newNode = createNode(data);

并提前在 createNode(data)函数中为头节点分配结点空间,

然后 head->next=NULL,此时只有头节点,所以链表下一个结点为空。

尾插法关键代码就是

struct Node* tailNode = headNode;
    while (tailNode->next != NULL)
    {

        tailNode = tailNode->next;
    }
    tailNode->next = newNode;

头插法  依次插入0-9 

尾插法  依次插入 100  1000两个数

// 表头插入  表尾插入  打印链表


/*   任务   */
//  1、创建表
//  2、创建节点
//  3、表头插入
//  4、表尾插入
//  5、打印表
//  6、表头删除


#include<stdio.h>
#include<stdlib.h>

/*  C语言  <1>  什么是链式结构  碎片内存存储*/
/*  创建表:结构体变量和结构体变量  连接在一起  */
//  结构体变量  使用指针去表示----->指针成为变量------->动态内存申请
//  如何去表示一个表:使用第一个节点来表示整个链表
struct Node   //自定义节点
{

	int data;
	struct Node *next;
};

//  1、创建表
struct Node *createList()
{

	struct Node *headNode = (struct Node*)malloc(sizeof(struct Node));
	headNode->next = NULL;

	//  变量规则:变量需要初始化,才能使用

	//data  为什么不可以初始化  不初始化 与众不同  有表头的链表
	//  差异化处理
	headNode->data = -111;
	return headNode; //  返回指针变量

}

//  2、创建节点  为插入做准备,学习数据的时候,一定要把功能划分明确
struct Node *createNode(int data)
{
	struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;

	return newNode;  返回指针变量
}


//  3、表头插入
//  插在头结点之后  插队插入,不能越过头结点
//  插队插入,不能越过头结点

// 函数参数设计是具有含义的:插入那个链表??插入的新节点的定义变量
void insertNodeByHead(struct Node *headNode, int data)  //表头法插入
{
	
	// 1、插入的新节点的定义变量
	struct Node* newNode = createNode(data);
	// 2、 插在头结点之后  插队插入,不能越过头结点
	newNode->next = headNode->next;

	headNode->next = newNode;
}

//  4、表尾插入
void insertNodeByTail(struct Node *headNode, int data)
{

	struct Node* newNode = createNode(data);
	struct Node* tailNode = headNode;
	while (tailNode->next != NULL)
	{

		tailNode = tailNode->next;
	}
	tailNode->next = newNode;
}




void printList(struct Node *headNode)  //打印,浏览信息
{

	//  有表头,要从第二个节点开始打印
	struct Node *pMove = headNode->next;
	while (pMove != NULL)
	{
		printf("%d\t", pMove->data);
		pMove = pMove->next;


	}

	printf("\n");
}

int main()
{


	struct Node *list1 = createList();
	for (int i = 0; i < 10; i++)
	{
		insertNodeByHead(list1, i);
	}
	printList(list1);
	insertNodeByTail(list1, 100);
	insertNodeByTail(list1, 1000);
	printList(list1);
	system("pause");
	return 0;
}

头插法  依次插入0-9 

尾插法  插入 100  1000两个数

 

  • 6
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
链表的逆序创建插入和删除等基本操作算法如下: 1. 链表的逆序创建: 1.1 定义一个指向链表头结点的指针head,一个指向新节点的指针pnew和一个指向上一个节点的指针pre。 1.2 将head指针指向NULL,链表为空。 1.3 循环输入新节点的值,直到输入0为止。 1.4 创建一个新节点pnew,将输入的值赋值给pnew->data。 1.5 如果head指针为NULL,则将head指向pnew,pnew->next指向NULL。 1.6 如果head指针不为NULL,则将pnew->next指向head,head指向pnew。 1.7 将pre指向pnew,以便下一次循环使用。 1.8 最后输出链表中所有节点的值。 2. 链表插入操作: 2.1 定义一个指向链表头结点的指针head、一个指向待插入节点的指针pnew和一个指向待插入位置前一个节点的指针pre。 2.2 创建一个新节点pnew,将待插入值赋值给pnew->data。 2.3 如果head指针为NULL,则将head指向pnew,pnew->next指向NULL。 2.4 如果head指针不为NULL,则使用循环找到待插入位置的前一个节点pre。 2.5 将pnew->next指向pre->next,将pre->next指向pnew,完成插入操作。 2.6 最后输出链表中所有节点的值。 3. 链表的删除操作: 3.1 定义一个指向链表头结点的指针head、一个指向待删除节点的指针pdel和一个指向待删除位置前一个节点的指针pre。 3.2 如果head指针为NULL,则提示链表为空,删除操作无法进行。 3.3 如果head指针不为NULL,则使用循环找到待删除位置的前一个节点pre。 3.4 如果pre->next指向NULL,则提示该位置不存在节点,删除操作无法进行。 3.5 如果pre->next指向待删除节点pdel,则将pre->next指向pdel->next,完成删除操作。 3.6 释放pdel节点的内存空间。 3.7 最后输出链表中所有节点的值。 以上就是链表的逆序创建插入和删除等基本操作算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love coldplay

你的鼓励,将让我持续更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值