单链表的插入 删除 及带环 问题

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<stdlib.h>
typedef int Datatype;
typedef struct SListNode
{
	Datatype data;
	struct SListNode*next;
}SListNode;
void Erase(SListNode*&pHead, SListNode *pos);
void PushBack(SListNode*&pHead, Datatype x);
void PopBack(SListNode *&pHead);
void PrintSlist(SListNode *&PHead);
void PushFrot(SListNode*&pHead, Datatype x);
void PopFront(SListNode*&pHead);
SListNode *Find(SListNode*pHead, Datatype x);

SListNode* _BuyNode(Datatype x)
{
	SListNode *temp = (SListNode*)malloc(sizeof(SListNode));
	temp->data = x;
	temp->next = NULL;
	return temp;
}
void PushBack(SListNode*&pHead, Datatype x)
{
	//1 空   2  不为空
	if (pHead == NULL)
	{
		pHead = _BuyNode(x);
	}
	else
	{
		SListNode *tail = pHead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = _BuyNode(x);
	}
}
void PopBack(SListNode *&pHead)
{
	//1空  2 一个节点  3 多个节点  
	if (pHead == NULL)
	{
		return;
	}
	else if (pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else{
		SListNode *tail = pHead;
		SListNode *tem = NULL;
		while (tail->next != NULL)
		{
			tem = tail;
			tail = tail->next;
		}
		free(tail);
		tem->next = NULL;
	}
}
void PrintSlist(SListNode *&PHead)
{
	SListNode*cur = PHead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
void PushFrot(SListNode*&pHead, Datatype x)
{
	if (pHead == NULL)
	{
		pHead = _BuyNode(x);
	}
	else
	{
		SListNode *tmp = _BuyNode(x);
		tmp->next = pHead;
		pHead = tmp;
	}
}
void PopFront(SListNode*&pHead)
{
	//1 空
	//2 一个结点
	//3 一个以上的节点
	if (pHead == NULL)
	{
		return;
	}
	else if (pHead->next == NULL)
	{
		free(pHead);
		pHead = NULL;
	}
	else
	{
		SListNode *tmp = pHead;
		pHead = pHead->next;
		free(tmp);
	}

}

SListNode *Find(SListNode*pHead, Datatype x)
{
	SListNode *tail = pHead;
	while (tail)
	{
		if (tail->data == x)
		{
			return tail;
		}
		tail = tail->next;
	}
	return NULL;
}
void Erase(SListNode *&pHead, SListNode *pos)
{
	assert(pos);
	assert(pHead);
	if (pHead == pos)
	{
		pHead = pHead->next;
		free(pos);
		return;
	}
	SListNode *prv = pHead;
	while (prv)
	{
		if (prv->next == pos)
		{
			prv->next = pos->next;
			free(pos);
			break;
		}
		prv = prv->next;
	}
}
SListNode *yuesefu(SListNode*phead, int k)
{
	SListNode *tail = phead;
	while (1)
	{
		if (tail->next == tail)
		{
			return tail;
		}
		int count = k;
		while (--count)
		{
			tail = tail->next;
		}
		SListNode *del = tail->next;//删除节点
		tail->data = del->data;
		tail->next = del->next;
		free(del);
	}

}
//合并两个有序链表,合并后依然有序
SListNode *hebing(SListNode *L1, SListNode *L2)
{
	//1 L1为空
	//2 L2  为空
	//3 两者都为空
	if (L1 == NULL)
	{
		return L2;
	}
	if (L2 == NULL)
	{
		return L1;
	}
	SListNode *newhead = NULL;
	SListNode *phead1 = L1;
	SListNode *phead2 = L2;
	if (phead1->data < phead2->data)
	{
		newhead = phead1;
		phead1 = phead1->next;
	}
	else
	{
		newhead = phead2;
		phead2 = phead2->next;

	}
	SListNode *tail = newhead;
	while (phead1&&phead2)
	{
		if (phead1->data < phead2->data)
		{
			tail->next = phead1;
			tail = tail->next;
			phead1 = phead1->next;
		}
		else
		{
			tail->next = phead2;
			phead2 = phead2->next;
			tail = tail->next;
		}
	}
	if (phead1)
		{
			tail->next = phead1;
		}
		else
		{
			tail->next = phead2;
		}
	return newhead;
}

//判断链表是否带环 环的长度
SListNode *checkcycle(SListNode * phead)
{
	SListNode * fast = phead;
	SListNode *slow = phead;
	while (fast&&fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
		if (fast == slow)
		{
			return fast;
		}
	}
	return NULL;

}
int getcyclelength(SListNode *meetNode)
{
	assert(meetNode);
	SListNode *cur = meetNode;
	int count = 0;
	do{
		++count;
		cur = cur->next;
	} while (cur != meetNode);
		return count;
}
void test6()
{
	SListNode*list1= NULL;
	SListNode*list2= NULL;
	PushBack(list1, 1);
	PushBack(list1, 3);
	PushBack(list1, 5);
     PushBack(list1, 7);
	PushBack(list1, 8);
	PushBack(list1, 5);
	PushBack(list1, 7);
	PushBack(list1, 8);
	//PushBack(list1, 9);
	/*PushBack(list2, 2);
	PushBack(list2, 4);
	PushBack(list2, 6);
	PushBack(list2, 8);
	PushBack(list2, 10);*/
	//SListNode *tmp= hebing(list1, list2);
	//SListNode* ret = Find(list, 6);
	//ret->next = list;
	//SListNode*ret2 = yuesefu(list, 3);
	//printf("%d \n", ret2->data);
	//PrintSlist(tmp);
	 /*SListNode * cmp=checkcycle(list1);
	 int len = getcyclelength(cmp);
	 printf("%d \n", len);*/
}

void test7()
{
	SListNode*list1 = NULL;
	PushBack(list1, 1);
	PushBack(list1, 2);
	PushBack(list1, 3);
	PushBack(list1, 4);
	PushBack(list1, 5);
	PrintSlist(list1);
	SListNode* ret1 = Find(list1, 5);
	SListNode* ret2 = Find(list1, 3);
	ret1->next = ret2;
	SListNode* ret = checkcycle(list1);
	printf("%d\n", ret->data);
    int len = getcyclelength(ret);
	printf("%d ", len);
}

int main()
{
	//test1();
	test7();
	system("pause");
	return 0;
}
时间: 2024-10-13 09:53:54

单链表的插入 删除 及带环 问题的相关文章

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看. 链表创建: 1.先建立一个不含数据的头指针*head,头指针的链接域为NULL. 2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head. 3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc. #define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误

数据结构-编程实现一个单链表节点的删除

1:代码如下: // ConsoleApplication15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <malloc.h> #include <iostream> using namespace std; typedef struct node//定义链表结构体 { int data;//节点内容 node *next;//指向结构体的指针,下一个节点 }node; node *create()

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

单链表顺序插入

向单链表中插入新元素,并保证插入后,元素是有序的. [程序实例] 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 bool sll_insert(ListNode **root, int value) 8 { 9 ListNode *PrevNode =NULL; 10 ListNode *Current = *root; 11 12 while (Current!=NULL && Current->val<

单链表实现“插入”和“删除”操作

在单链表中,又如何实现"插入"和"删除"操作呢? 插入操作: 假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针.为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中.根据插入操作的逻辑定义,还需修改结点a中的指针域,令其指向结点x,而结点x中的指针域应该指向b结点,从而实现3个元素a,b和x之间逻辑关系的变化. 假设s为指向结点x的指针.则上述指针修改用语句描述即为: s->next=p-

单链表的插入伪算法和用C语言创建单链表,并遍历

非循环单链表插入结点伪算法讲解 q插入p之后的伪算法:第一种表示方法:r = p->pNext; // p->pNext表示的是所指向结点的指针域,指针域又是指向下一个结点的地址p->pNext = q; // q保存了那一块结点的地址.q是一个指针变量,存放那个结点的地址.q->pNext = r; 第二种表示方法:q->pNext = p->pNext; // q的指针域指向p后面一个结点p->pNext = q; // p的指针域指向q 删除非循环单链表结点

单链表的插入

预编译 #include <stdio.h> #include <stdlib.h> #define status int #define TRUE 1 #define FALSE 0 数据结构 typedef struct NODE{ struct NODE *next; /* 指向下一个结点 */ int value; /* 存放结点值 */ }Node, *PNode, **List; 插入代码 1 /* 2 功能描述: 3 把一个值插入到单链表(从小到大) 4 5 参数: