單項鍊表的實現




mylist.h

#define _CRT_SECURE_NO_DEPRECATE 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef int DataType; 

typedef struct ListNode 
{ 
	DataType data; 
	struct ListNode* next; 
}ListNode; 

void PrintList(ListNode* pList); 
void PushBack(ListNode** ppList, DataType input); 
void PopBack(ListNode** ppList); 
void PushFront(ListNode** ppList, DataType input); 
void PopFront(ListNode** ppList); 
ListNode* Find(ListNode* pList, DataType input); 

// 在pos的前面插入一個節點x 
void Insert(ListNode** ppList, ListNode* pos, DataType input); 
void Erase(ListNode** ppList, ListNode* pos); 


mylist.c

#include"mylist.h"

ListNode* BuyNode(DataType input)
{
	ListNode * node;
	node =  (ListNode*)malloc(sizeof(ListNode));
	node->data = input;
	node->next = NULL;
	return node;
}

void PrintList(ListNode* pList)
{
	ListNode* tmp = pList;

	while(tmp != NULL)
	{
		printf("%d->",tmp->data);
	    tmp = tmp->next;
	}
	printf("NULL\n");
}
void PushBack(ListNode** ppList, DataType input)
{
	//1沒有節點
	//2有一個節點
	//3有多個節點
	

	if(*ppList == NULL)
	{
	   *ppList = BuyNode(input);
	}
	else if((*ppList)->next == NULL)
	{
		(*ppList)->next = BuyNode(input);
	}
	else
	{
		ListNode* tmp =*ppList;
		while(tmp->next != NULL)
		{
			tmp =tmp->next ;
		}
		tmp->next = BuyNode(input);
	}
}

void PopBack(ListNode** ppList)
{
	//1沒有節點
	//2只有一個節點
	//3有多個節點
	assert(ppList);

    if(*ppList == NULL)
	{
		return;
	}
	else if((*ppList)->next == NULL)
	{
		free(*ppList);
		*ppList = NULL;
	
	}
	else
	{
		ListNode* tmp = *ppList;
		ListNode* pos;
		while(tmp->next != NULL)
		{
		    pos = tmp;
		    tmp = tmp->next ;
		}
		free(tmp);
		tmp=NULL;
		pos->next = NULL;
	}
}
void PushFront(ListNode** ppList, DataType input)
{
	//1沒有節點
	//2有節點
	

	if(*ppList == NULL)
	{
		*ppList = BuyNode(input);
	}
	else
	{
		ListNode* tmp = BuyNode(input);
		tmp->next = *ppList;             //把已有鏈表的頭給新節點的next
		*ppList = tmp;                    //再把新節點的頭(新鏈表的頭)給*ppList
	}
}
void PopFront(ListNode** ppList)
{
	//1沒有節點
	//2有多個節點
	
	if(*ppList == NULL)
	{
		return ;
	}
	else
	{
		ListNode* tmp = (*ppList)->next;
		free(*ppList);
		*ppList = NULL;
	    *ppList = tmp;
	}

}
ListNode* Find(ListNode* pList, DataType input)
{
	//1沒有節點
	//2有節點
	if((pList == NULL))
	{
		return  NULL;
	}
	else
	{
		ListNode* pos = pList;
		while(pos)
		{
		  if(pos->data == input)
		  {
			  return pos;
		  }
		  else
			  pos = pos->next;
		}
	}
	return NULL;

}
// 在pos的前面插入一個節點x 
void Insert(ListNode** ppList, ListNode* pos, DataType input)
{
	//1空鏈表
	//2在第一個前面插入
	//3在中間插入
	assert(pos);
	if(*ppList == NULL)
	{
		return ;
	}
	else if((*ppList == pos) || (*ppList)->data == pos->data)
	{
	   PushFront(ppList,input);
	}
	else
	{
		 ListNode* tmp = *ppList;
		 ListNode* NewNode;
		 while((tmp->next) != pos)
		 {
			 tmp = tmp->next;
		 }
		 NewNode = BuyNode(input);
		 tmp->next = NewNode;
		 NewNode->next = pos;
	}
}

void Erase(ListNode** ppList, ListNode* pos)
{
	//1沒有節點
	//2刪除頭節點
	// 刪除尾結點
	//3多個節點
    assert(pos);
	if(*ppList == NULL)
	{
		return ;
	}
	else if((*ppList)-> data == pos->data )
	{
		PopFront(ppList);
		free(pos);
		pos->next = NULL;
	}
	else if(pos->next == NULL)
	{
		PopBack(ppList);
		free(pos);
		pos->next = NULL;
	}
	else
	{
		ListNode* tmp =*ppList;
		ListNode* pretmp;
		while (tmp->next != pos )
		{
			pretmp = tmp;
			tmp = tmp->next;
		}
	    tmp->next = pos->next ;
		free(pos);
		pos->next = NULL;
	}

}
test.c

#include"mylist.h"
void test1()
{
	ListNode* mylist=NULL;
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PrintList(mylist);
	PopBack(&mylist);
	PopBack(&mylist);
	PopBack(&mylist);
	PopBack(&mylist);
	PrintList(mylist);
	PushFront(&mylist,1);
	PushFront(&mylist,2);
	PushFront(&mylist,3);
	PushFront(&mylist,4);
	PrintList(mylist);
	PopFront(&mylist);
	PopFront(&mylist);
	PopFront(&mylist);
	PopFront(&mylist);
	PrintList(mylist);
}

void test2()
{

	ListNode* mylist=NULL;
	ListNode* pos ;
	PushFront(&mylist,1);
	PushFront(&mylist,2);
	PushFront(&mylist,3);
	PushFront(&mylist,4);
	PrintList(mylist);
	pos = Find(mylist,2);
	printf("此元素地址 %p\n",Find(mylist,4));
	Insert(&mylist,pos,0);  //總是插入在最後面
	PrintList(mylist);
	Erase(&mylist,pos);
	PrintList(mylist);
}
int main()
{
	
	test1();
	test2();
	system("pause");
	return 0;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章