头插法尾插法按位置插入创建删除链表

/*
 * 时间:2015年7月28日07:54:10
 * 项目:单链表(头插法和尾插法)
*/

# include <stdio.h>

typedef int ElemType;

typedef struct Node{
	Node *next;
	ElemType data;
}LinkList;

/*头插法,拥有头指针*/
void InitLinkListHead(LinkList *headList)
{
	headList->next = NULL;
	headList->data = 0; /*代表线性表的长度*/
}

//每次从头部进行插入,插入的时间复杂度o(1)
void InsertHead(LinkList *headList,ElemType value)
{
	Node *newnode = new Node;
	newnode->data = value;
	newnode->next = headList->next;
	headList->next = newnode;
	headList->data++;
}

//头指针删除元素
ElemType DeleteElem(LinkList *headList)
{
	if(headList->data <= 0)
	{
		printf("链表中没有元素所以你不能删除\n");
		return -1;
	}
	else
	{
		ElemType value = headList->next->data;
		headList->next = headList->next->next;
		headList->data--;
		return value;
	}
}

/*尾插入法,尾指针*/

//初始化表尾微针
void InitEndList(Node *end)
{
	end->data = 0;//表示链表的长度
	end->next = NULL;
}

//每次从尾部进行插入,插入时间为o(1)
/*这里必须使用二级指针,原因是因为*endList = newnode,因为当链表长度为空时,链表必须先指向新的第一个元素
 *如果不使用二级指针会使得原本的地址没有了指向,不理解建议看看二级指针的用法和意义。
*/
void InsertEnd(LinkList **endList,ElemType value,Node *end)
{
	Node *newnode = new Node;
	newnode->data = value;
	newnode->next = NULL;
	if(end->data == 0)
	{
		*endList = newnode; //让没有任何元素的链表先指向一个新的元素
		end->next = newnode; //每次尾指针都是指向新的元素
	}
	else
	{
		end->next->next = newnode;
		end->next = newnode;
	}
	end->data++; //插入一个元素就让其进行自加
}

//尾插法删除数据
ElemType DeleteElemEnd(LinkList **endList,Node *end)
{
	if(end->data == 0)
	{
		printf("链表中没有任何元素,无法进行插入");
		return -1;
	}
	else
	{
		ElemType value;
		if(end->data == 1)
		{
			value = (*endList)->data;
			endList = NULL;

		}
		else
		{
			value = (*endList)->data;
			(*endList) = (*endList)->next;
		}
		end->data--;
		return value;
	}
}

/*可以自由选择位置进行插入,插入的时间复杂度o(n)*/
void InsertLocation(LinkList *headList,ElemType value,int location)
{
	if(location > headList->data+1 || location <= 0)
		printf("很抱歉,你想要插入的位置是(%d),不符合实际情况\n",location);
	else
	{
		Node *newnode = new Node;
		newnode->data = value;
		Node *temp = headList;
		for(int i = 1;i < location;i++)
			temp = temp->next;
		newnode->next = temp->next;
		temp->next = newnode;
		headList->data++;
	}
}

//可以任意选择位置进行删除
void DeleteLocation(LinkList *headList,ElemType &value,int location)
{
	if(location > headList->data+1 || location <= 0)
		printf("很抱歉,你想要插入的位置(%d)不符合实际情况\n",location);
	else
	{
		Node *newnode = headList;
		for(int i = 1;i < location;i++)
			newnode = newnode->next;
		value = newnode->next->data;
		newnode->next = newnode->next->next;
		headList->data--;
	}
}

/*头指针和位置插入法输出函数*/
void printList(LinkList *headList)
{

	Node *temp = headList->next;
	int i = 0;
	while(temp)
	{
		if(i%10 == 0)
			printf("\n");
		printf("%4d",temp->data);
		i++;
		temp = temp->next;
	}
	printf("\n");
}

/*尾指针输出法*/
void printfEnd(LinkList *list,Node *end)
{
	if(end->data == 0)
		printf("链表中没有任何元素\n");
	else
	{
		LinkList *temp = list;
		for(int i = 0;i < end->data;i++)
		{
			if(i%10 == 0)
				printf("\n");
			printf("%4d",temp->data);
			temp = temp->next;
		}
	}
	printf("\n");
}

int main()
{
	printf("头指针插入法:\n");
	LinkList list;
	InitLinkListHead(&list);
	for(int i = 0;i < 50;i++)
		InsertHead(&list,i);
	printList(&list);

	printf("尾指针插入法:\n");
	LinkList *linklistend;
	Node end;
	InitEndList(&end);
	for(int j = 0;j < 50;j++)
		InsertEnd(&linklistend,j,&end);
	printfEnd(linklistend,&end);

	printf("按照位置插入法:\n");
	LinkList listLocation;
	InitLinkListHead(&listLocation);
	for(int z = 0;z < 50;z++)
		InsertLocation(&listLocation,z,z);
	printList(&listLocation);

	printf("进行删除操作:\n\n");
	printf("1.头指针删除法:\n");
	DeleteElem(&list);
	printList(&list);

	/*和尾插入法一样,必须巧用二级指针*/
	printf("2.尾指针删除法:\n");
	DeleteElemEnd(&linklistend,&end);
	printfEnd(linklistend,&end);

	printf("3.按照位置删除法:\n");
	int value;
	DeleteLocation(&listLocation,value,4);
	printList(&listLocation);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 15:46:54

头插法尾插法按位置插入创建删除链表的相关文章

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

单链表的头插法和尾插法c语言实现

/*单链表的头插法和尾插法c语言实现*/ #include <stdio.h>#include <stdlib.h>#include <string.h>#define SIZE 100/*简单的定义一个链表节点的数据单元*/typedef struct student_t{ int num; char name[SIZE]; struct student_t* pNext;}studentList, *pStudentList; /*定义一个全局的静态的链表头节点指针

C实现头插法和尾插法来构建单链表(不带头结点)

链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.假设想要了解链表的概念和其它链表操作.请參考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.演示样例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // Hea

C实现头插法和尾插法来构建链表

链表的构建其实也就是不断插入节点的过程.而节点的插入可以分为头插法和尾插法.头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点.如果想要了解链表的概念和其他链表操作,请参考<数据结构与算法之链表><C语言实现链表的基本操作>两篇文章.示例代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsert . // // main.c // HeadIns

链表的头插法和尾插法

链表的头插法和尾插法 本文的链表均是带头结点的链表. 链表可以说是最简单的链式结构,在C语言中,通常用结构体封装其数据域及指针域作为一个结点. 今天我们说的是链表结点的构造方式以及插入方式. 尾插法 1 //尾插法 2 3 void createlistR(LNode *&C,int a[],int n){ 4 LNode *s,*r; 5 int i; 6 C = (LNode*)malloc(sizeof(LNode)); 7 C->next = NULL; 8 r = C; 9 for

C实现头插法和尾插法来构建非循环双链表(不带头结点)

在实际使用中,双链表比单链表方便很多,也更为灵活.对于不带头结点的非循环双链表的基本操作,我在<C语言实现双向非循环链表(不带头结点)的基本操作>这篇文章中有详细的实现.今天我们就要用两种不同的方式头插法和尾插法来建立双链表.代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsertDoubleList  . 核心代码如下: //尾插法创建不带头结点的非循环双向链表 Node *TailInsertCreateList(No

单链表:头插法和尾插法

头插法: linklist *CreateList_Front() { linklist *head, *p; char ch; head = NULL; printf("依次输入字符数据(‘#’表示输入结束):\n"); ch = getchar(); while(ch != '#') { p = (linklist*)malloc(sizeof(linklist)); p->data = ch; p->next = head; head = p; ch = getcha

头插法和尾插法

. #include "stdio.h" #include "stdlib.h" typedef struct List { int data; //数据域 struct List *next; //指针域 } List; void TailCreatList(List *L) //尾插法建立链表 { List *s, *r;//s用来指向新生成的节点.r始终指向L的终端节点. r = L; //r指向了头节点,此时的头节点是终端节点. for (int i = 0

链式存储(头插法、尾插法)

#include "stdio.h" #include "string.h" #include "ctype.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FAL