zoukankan      html  css  js  c++  java
  • 单链表

    LinkList.h

    #pragma once
    
    #include<stdio.h>
    #include<assert.h>
    #include<malloc.h>
    typedef int DataType;
    typedef struct Node
    {
    	DataType data;
    	struct Node* next;
    }Node, *plist;
    plist _CreateNode(DataType x);
    void InitLinklist(plist* pplist);
    void PrintLinklist(plist list);
    void PushBack(plist* pplist, DataType x);
    int GetLength(plist list);
    void PushFront(plist* pplist, DataType x);
    void PopFront(plist* pplist);
    void PopBack(plist* pplist);
    Node* Find(plist list, DataType x);
    void Insert(plist* pplist, Node * n, DataType x);
    void Remove(plist* pplist, Node * n);
    int Erase(plist* pplist, DataType x);
    int EraseAll(plist* pplist, DataType x, DataType all);
    void DeleteNode(Node* n);
    void InsertFront(Node* n, DataType x);
    void PrintEndToBegin(plist list);
    

    LinkList.c

    #include"LinkList.h"
    plist _CreateNode(DataType x)
    {
    	plist tmp = (plist)malloc(sizeof(Node));
    	tmp->data = x;
    	tmp->next = NULL;
    	return tmp;
    }
    void InitLinklist(plist* pplist)
    {
    	assert(pplist);
    	*pplist = NULL;
    }
    void PrintLinklist(plist list)
    {
    	plist begin = list; 
    	while (begin != NULL)
    	{
    		printf("%d->", begin->data);
    		begin = begin->next;
    	}
    	printf("NULL
    ");
    }
    void PushBack(plist* pplist, DataType x)
    {
    	assert(pplist);
    	if (*pplist == NULL)
    	{
    		(*pplist) = _CreateNode(x);
    	}
    	else
    	{
    		plist tmp = *pplist;
    		plist endNode = _CreateNode(x);
    		while (tmp->next != NULL)
    		{
    			tmp = tmp->next;
    		}
    		tmp->next = endNode;
    		tmp = endNode;
    	}
    }
    void PushFront(plist* pplist, DataType x)
    {
    	assert(pplist);
    	if (*pplist == NULL)
    	{
    		(*pplist) = _CreateNode(x);
    	}
    	else
    	{
    		plist s = _CreateNode(x);
    		s->next = *pplist;
    		*pplist = s;
    	}
    }
    int GetLength(plist list)
    {
    	int len = 0;
    	while (list->next != NULL)
    	{
    		len++;
    		list = list->next;
    	}
    	return len+1;
    }
    void PopFront(plist* pplist)
    {
    	assert(pplist);
    	if ((*pplist) == NULL)
    	{
    		printf("The Link Is Empty
    ");
    	}
    	else
    	{
    		*pplist = (*pplist)->next;
    	}
    }
    void PopBack(plist* pplist)
    {
    	assert(pplist);
    	if ((*pplist) == NULL)
    	{
    		printf("The Link Is Empty
    ");
    	}
    	if ((*pplist)->next == NULL)
    	{
    		free(*pplist);
    		*pplist = NULL;
    	}
    	else
    	{
    		plist prev = 0, end;
    		end = *pplist;
    		while (end->next != NULL)
    		{
    			prev = end;
    			end = end->next;
    		}
    		free(end);
    		prev->next=NULL;
    	}
    }
    //返回值为NULL时,找不到此元素或者链表为空。反之。返回值为指向x的指针
    Node* Find(plist list, DataType x)
    {
    	plist begin = list;
    	while (begin != NULL)
    	{
    		if (begin->data == x)
    		{
    			return begin;
    		}
    		else
    		{
    			begin = begin->next;
    		}
    	}
    	return NULL;
    }
    void Insert(plist* pplist, Node * n, DataType x)
    {
    	assert(pplist);
    	//空表时插入值
    	if (*pplist == NULL)
    	{
    		*pplist = _CreateNode(x);
    	}
    	n = Find(*pplist, 6);
    	if (n == NULL)
    	{
    		printf("此链表中没有此元素
    ");
    	}
    	else
    	{
    		plist anyNode = _CreateNode(x);
    		//一个节点时插入值
    		if (n->next == NULL)
    		{
    			n->next = anyNode;
    		}
    		//多个节点时插入值
    		else
    		{
    			anyNode->next = n->next;
    			n->next = anyNode;
    		}
    	}
    }
    int Erase(plist* pplist, DataType x)
    {
    	assert(pplist);
    	Node* n;
    	if (*pplist == NULL)
    	{
    		printf("The Link Is Empty
    ");
    	}
    	n = Find(*pplist, x);
    	if (n == NULL)
    	{
    		printf("此链表中没有此元素
    ");
    	}
    	else
    	{
    		plist prev=0,tmp=0;
    		tmp = *pplist;
    		//删除头结点及包含处理仅仅有一个节点时的情况
    		if ((*pplist)->data == x)
    		{
    			*pplist = (*pplist)->next;
    			free(tmp);
    			return 0;
    		}
    		//处理有多个节点的情况
    		while (tmp != NULL && tmp->data != x)
    		{
    			prev = tmp;
    			tmp = tmp->next;
    		}
    		prev->next = tmp->next;
    		free(tmp);
    	}
    	return 0;
    }
    void Remove(plist* pplist, Node * n)
    {
    	assert(pplist);
    	if (*pplist == NULL)
    	{
    		printf("The Link Is Empty
    ");
    	}
    	n = Find(*pplist, 9);
    	if (n == NULL)
    	{
    		printf("此链表中没有此元素
    ");
    	}
    	else
    	{
    		plist pre = 0, tmp;
    		tmp = *pplist;
    		if (*pplist == n)
    		{
    			*pplist = (*pplist)->next;
    			free(tmp);
    			return;
    		}
    		while (tmp != NULL && tmp != n)
    		{
    			pre = tmp;
    			tmp = tmp->next;
    		}
    		pre->next = tmp->next;
    		free(tmp);
    	}
    }
    int EraseAll(plist* pplist, DataType x,DataType all)
    {
    	assert(pplist);
    	Node* n;
    	if (*pplist == NULL)
    	{
    		printf("The Link Is Empty
    ");
    	}
    	n = Find(*pplist, 5);
    	if (n == NULL)
    	{
    		printf("此链表中没有此元素
    ");
    	}
    	else
    	{
    		plist prev = 0, tmp = 0;
    		tmp = *pplist;
    		//删除一个x时的情况
    		if (all == 0)
    		{
    			if ((*pplist)->data == x)
    			{
    				*pplist = (*pplist)->next;
    				free(tmp);
    				return 0;
    			}
    			//处理有多个节点的情况
    			while (tmp != NULL && tmp->data != x)
    			{
    				prev = tmp;
    				tmp = tmp->next;
    			}
    			prev->next = tmp->next;
    			free(tmp);
    		}
    		//删除多个x的情况
    		else
    		{
    			plist ptmp;
    			//删除且为头结点的情况
    			if ((*pplist)->data == x)
    			{
    				*pplist = (*pplist)->next;
    				free(tmp);
    			}
    			ptmp = *pplist;
    			while (ptmp != NULL)
    			{
    				while (ptmp != NULL && ptmp->data != x)
    				{
    					prev = ptmp;
    					ptmp = ptmp->next;
    				}
    				if (ptmp == NULL)
    				{
    					break;
    				}
    				prev->next = ptmp->next;
    				free(ptmp);
    				ptmp = NULL;
    				ptmp = *pplist;
    			}
    		}
    	}
    	return 0;
    }
    void DeleteNode(Node* n)
    {
    	if (n == NULL)
    	{
    		printf("Node Is NULL
    ");
    	}
    	if (n->next == NULL)
    	{
    		PopBack(&n);
    	}
    	else
    	{
    		plist del = n->next;
    		n->data = del->data;
    		n->next = del->next;
    		free(del);
    	}
    }
    void InsertFront(Node* n, DataType x)
    {
    	Node* tmp = n;
    	DataType ptmp = 0;
    	if (tmp == NULL)
    	{
    		printf("Node Is NULL
    ");
    	}
    	else
    	{
    		Node* begin = _CreateNode(x);
    		begin->next = tmp->next;
    		tmp->next = begin;
    		ptmp = tmp->data;
    		tmp->data = begin->data;
    		begin->data =ptmp;
    	}
    }
    void PrintEndToBegin(plist list)//递归
    {
    	if (list == NULL)
    	{
    		return;
    	}
    	else
    	{
    		PrintEndToBegin(list->next);
    		printf("%d->", list->data);
    	}
    }
    
    void Test()
    {
    	plist s;
    	Node* pFind ;
    	int ret = 0;
    	InitLinklist(&s);
    	PushBack(&s, 1);
    	PushBack(&s, 2);
    	PushBack(&s, 3);
    	PrintLinklist(s);
    	PushFront(&s, 1);
    	PushFront(&s, 4);
    	PushFront(&s, 5);
    	PushFront(&s, 5);
    	PushFront(&s, 6);
    	PushFront(&s, 5);
    	PushFront(&s, 1);
    	PrintLinklist(s);
    	ret = GetLength(s);
    	printf("链表的长度为:%d
    ", ret);
    	PopFront(&s);
    	PrintLinklist(s);
    	PopBack(&s);
    	PrintLinklist(s);
    	PopFront(&s);
    	pFind = Find(s, 6);
    	Insert(&s, pFind, 9);
    	PrintLinklist(s);
    	pFind = Find(s, 9);
    	Remove(&s, pFind);
    	PrintLinklist(s);
    	Erase(&s, 4);
    	PrintLinklist(s);
    	pFind = Find(s, 5);
    	DeleteNode(pFind);
    	PrintLinklist(s);
    	pFind = Find(s, 3);
    	InsertFront(pFind, 109);
    	PrintLinklist(s);
    	EraseAll(&s, 5,1);
    	PrintLinklist(s);
    	PrintEndToBegin(s);
    }
    
    void main()
    {
    	Test();
    }


  • 相关阅读:
    linux常用命令(一)
    并发与高并发(十九) 高并发の消息队列思路
    鉴别web服务器的工具类
    并发与高并发(十八) 高并发之缓存思路
    记一次多线程下使用while出现的问题
    并发与高并发(十七)高并发之扩容思路
    并发与高并发(十六)多线程并发拓展
    并发与高并发(十五)线程池
    并发与高并发(十四)J.U.C组件拓展
    基于springboot实现Java阿里短信发送
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6894088.html
Copyright © 2011-2022 走看看