C语言版单链表的建立方式

数据结构C语言第二版:单链表的建立:尾插法,前插法,任意位置插入法

文章目录

  • 单链表的建立方式
  • 一、尾插法
  • 二、前插法
    • 1.引入库
  • 总结


单链表的建立方式

尾插法: 利用尾部结点的NULL 这个核心去突破
前插法:直接暴力赋值便可


提示:以下是本篇文章正文内容,下面案例可供参考

一、尾插法

尾插法的核心:利用单链表最后一个结点指向NULL为条件,进行插入。

//尾插入法
void tail_insert(RNode* head, int x)
{
	RNode* p = initnode();      //每次都生成一个结点
	p->data = x;
	if (head == NULL)
	{
		head->next = p;    //当只有头结点的时候
	}
	else
	{
		while (head->next != NULL)
		{
			head = head->next;   
			//寻找最后一个结点指向NULL
		}
		head->next = p;     
		  //将生成的结点的位置赋值给最后一个结点
	}
}

二、前插法

//前插法
void front_insert(RNode* head, int x)
{
	RNode* p = initnode();   //生成一个新结点
	p->data = x;
	if (head->next == NULL)
	{
		head->next = p;	
		//如果为一个空链表就直接赋值
	}
	else {
		p->next = head->next;     
		head->next = p;
		/*这是把头结点指针域的值赋值新生成的结点指针域
		  头指针的指针在指向新生成的结点
		  这样就实现了前插法构建单链表
		*/
	}
}

1.引入库

代码如下(示例):

#include			//调用基本输入/输出库文件
#include          //调用标准库头文件,malloc函数在这个头文件中
#include			//使用系统库文件,暂停一下,看到执行结果

总结

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

typedef struct Node
{
	int data;
	struct Node* next;
}RNode;

//生成一个结点
RNode* initnode()
{
	RNode* node;
	node = (struct Node*)malloc(sizeof(struct Node));
	node->data = 0;
	node->next = NULL;
	return node;
}

//生成一个链表
RNode* createlink()
{
	RNode* head;
	head = initnode();
	head->next = NULL;      //生成了一个循环链表
	return head;
}

//尾插入法
void tail_insert(RNode* head, int x)
{
	RNode* p = initnode();      //每次都必须生成一个结点
	p->data = x;
	if (head == NULL)
	{
		head->next = p;
	}
	else
	{
		while (head->next != NULL)
		{
			head = head->next;
		}
		head->next = p;
	}
}

//前插法
void front_insert(RNode* head, int x)
{
	RNode* p = initnode();   //生成一个新结点
	p->data = x;
	if (head->next == NULL)
	{
		head->next = p;
	}
	else {
		p->next = head->next;
		head->next = p;
	}
}

void clear(RNode *head)
{
	head->next = NULL;
}

//打印函数
void display(RNode *head)
{
	RNode* p;
	p = head->next;
	while (p != NULL)
	{
		printf("%d->", p->data);
		p = p->next;
	}
	printf("NULL");
}

int main()
{
	RNode* linklist;
	linklist = createlink();
	for (int i = 2; i < 10; i++)
	{
		tail_insert(linklist, i);
	}
	display(linklist);
	clear(linklist);    //清空单链表
	printf("\n");
	for (int i = 9; i > 1; i--)
	{
		front_insert(linklist, i);
	}
	display(linklist);
	system("pause");
	return 0;
}

结果:
利用尾插法构建的单链表:
2->3->4->5->6->7->8->9->NULL
利用前插法构建的单链表:
2->3->4->5->6->7->8->9->NULL
介绍:
这里前插法我利用的for循环将9~2
的顺序插入到头结点之后,
目的是为了让大家更直观的看到前插的效果。

总结:前插法和尾插法都是单链表建立的方法,区别在于一个是在头部插进, 一个是在尾部插入,但其实基本步骤一致,只不过插入的方式不同, 比如尾插需要找指向NULL的结点,而前插法不需要。

你可能感兴趣的:(笔记,数据结构,链表,算法)