带头结点的单链表

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

#define error printf

struct node;
typedef int ElementType;
typedef struct node* List;
typedef struct node* Node;

struct node
{
	ElementType Element;
	Node Next;
};

List Initialize()
{
	List head = (struct node*)malloc(sizeof(struct node));
	if (head == NULL)
		error("out of space!\n");
	else
	{
		head->Next = NULL;
	}
	return head;
}

int IsEmpty(List list)
{
	if (list->Next == NULL)
		return 1;
	else
		return 0;
}

Node FoundI(List list,int i)         //查找序号为i的元素
{
	int k;
	Node P=list;

	for (k = 1; k <= i; k++)
	{
		P = P->Next;
	}
	return P;
}

Node FoundValue(List list, ElementType x)          //查找第一个值为x的元素
{
	Node P = list->Next;

	while ((P->Next != NULL) && (P->Element != x))
		P = P->Next;
	return P;
}

void InsertFirst(List list, ElementType value)         //插入新元素作为第一个元素
{
	Node TmpCell;
	
	TmpCell = (Node)malloc(sizeof(struct node));
	if (TmpCell == NULL)
		error("out of space!\n");
	else
	{
		TmpCell->Element = value;
		TmpCell->Next = list->Next;
		list->Next = TmpCell;
	}
}

void InsertLast(List list, ElementType value)         
{
	Node TmpCell,PtrLast;

	PtrLast = list;
	while (PtrLast->Next != NULL)
		PtrLast = PtrLast->Next;

	TmpCell = (Node)malloc(sizeof(struct node));
	if (TmpCell == NULL)
		error("out of space!\n");
	else 
	{
		TmpCell->Element = value;
		PtrLast->Next = TmpCell;
		TmpCell->Next = NULL;
	}
}

void InsertI(List list, int i, ElementType value)          //将元素插入到第i个位置
{
	Node TmpCell,PtrPreNode;     //PtrPreNode为指向第i个含有元素的节点的前一个节点的指针
	int k;

	PtrPreNode = list;
	for (k = 1; k < i; k++)
		PtrPreNode = PtrPreNode->Next;

	TmpCell = (Node)malloc(sizeof(struct node));
	if (TmpCell == NULL)
		error("out of space!\n");
	else
	{
		TmpCell->Element = value;
		TmpCell->Next = PtrPreNode->Next;
		PtrPreNode->Next = TmpCell;
	}
}

void DeleteFirst(List list)        //删除第一个元素
{
	Node TmpCell;
	if (!IsEmpty(list))
	{
		TmpCell = list->Next;
		list->Next = TmpCell->Next;
		free(TmpCell);
	}
}

void DeleteLast(List list)      //删除最后一个元素
{
	Node TmpCell,PtrLast,PtrPreLast;

	if (!IsEmpty(list))
	{
		if (list->Next->Next == NULL)    //链表只有一个带有元素的节点时
		{
			TmpCell = list->Next;
			free(TmpCell);
			list->Next = NULL;
		}
		else
		{
			/*PtrPreLast = list;
			PtrLast = list->Next;
			while ((PtrLast->Next) != NULL)
			{
				PtrLast = PtrLast->Next;
				PtrPreLast = PtrPreLast->Next;
			}
			PtrPreLast->Next = NULL;
			free(PtrLast);*/
			PtrPreLast = list;
			PtrLast = list->Next;
			while (PtrPreLast->Next->Next == NULL)
				PtrPreLast = PtrPreLast->Next;
			TmpCell = PtrPreLast->Next;
			PtrPreLast->Next = NULL;
			free(TmpCell);
		}
	}
	
}

void DeleteI(List list, int i)      //删除第i个元素
{
	int k;
	Node TmpCell,PtrPreNodeI;

	PtrPreNodeI = list;
	if (!IsEmpty(list))
	{
		for (k = 1; k < i; k++)
			PtrPreNodeI = PtrPreNodeI->Next;
		TmpCell = PtrPreNodeI->Next;
		PtrPreNodeI->Next = TmpCell->Next;
		free(TmpCell);
	}
}

int main()
{
	struct node list;
	Initialize(&list);
	InsertFirst(&list, 3);
	InsertFirst(&list, 6);
	InsertFirst(&list, 11);
	InsertFirst(&list, 23);
	DeleteLast(&list);

	Node P = FoundI(&list, 3);
	printf("%d\n", P->Element);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值