1. 程式人生 > >簡單鏈表C語言實現

簡單鏈表C語言實現

連結串列原理見連結


函式名取得不是很好,大家見諒。

list標頭檔案如下:

#ifndef  __LIST_DEMO_H__
#define __LIST_DEMO_H__

#include <stdio.h>
#include <malloc.h>
typedef struct node{
	int data;
	struct node* next;
}node_t,*pnode_t;

//-----------------------基礎-----------------------------------
//建立並初始化頭節點
pnode_t create_list();
//建立一個數據為data的節點,並返回節點地址
pnode_t create_node(int data);
//判斷連結串列是否為空連結串列(沒有資料節點)
int list_empty(pnode_t head);
//列印連結串列的所有資料節點
void print_list(pnode_t head);

//-----------------------查詢------------------------------------
//查詢資料為data的節點,並返回節點的地址
pnode_t find_node(pnode_t head,int data); //最核心程式碼
//查詢資料為data的節點的前一個節點
pnode_t find_prev(pnode_t head,int data); //最核心程式碼

//-----------------------插入------------------------------------
//把new指向的節點插入到p指向的節點後面
int insert_node_after(pnode_t p,pnode_t new); //最核心程式碼
//在p指向的節點後面插入一個數據為data的節點
int insert_data_after(pnode_t p,int data);
//把new_data插入到資料為data的節點後面
int insert_data(pnode_t head,int data,int new_data);
//把new_data插入到資料為data的節點的前面
int insert_prev(pnode_t head,int data,int new_data);

//-----------------------刪除------------------------------------
//刪除p指向的節點後面的節點
int del_after_node(pnode_t p); //最核心程式碼
//刪除資料為data的節點後面的節點
int del_after_data(pnode_t head,int data);
//刪除連結串列中資料為data的節點
int del_data(pnode_t head,int data);
//刪除連結串列中的所有資料節點
int clear(pnode_t head);
//銷燬連結串列(刪除所有資料節點和頭節點)
int destroy(pnode_t *phead);

#endif
list.c檔案如下
#include <stdio.h>
#include <malloc.h>
#include "list_demo.h"

//-----------------------基礎-----------------------------------
pnode_t	create_list()
{
	pnode_t head =  malloc(sizeof(node_t));
	if(head != NULL)
	{
		head->data = 0;
		head->next = NULL;
	}
	return head;
}

pnode_t create_node(int data)
{
	pnode_t p = (pnode_t)malloc(sizeof(node_t));
	if(p != NULL)
	{
		p->data = data;
		p->next = NULL;
	}
	return p;
}

int list_empty(pnode_t head)
{
	if(head == NULL)
	{
		return -1;  //連結串列不存在
	}
	if(head->next == NULL)
	{
		return 1; //連結串列為空
	}
	else
	{
		return 0;//連結串列非空
	}
}


void print_list(pnode_t head)
{
	pnode_t tmp = NULL;
	if(head == NULL)
	{
		puts("list is not exist!\n");
		return;
	}
	if(list_empty(head))
	{
		puts("list is empty!\n");
		return;
	}
	tmp = head->next;
	while(tmp!=NULL)
	{
		printf("%d\n",tmp->data);
		tmp = tmp->next;
	}
	return;
}


//-----------------------查詢------------------------------------
pnode_t find_node(pnode_t head,int data)
{	
	pnode_t tmp = NULL;
	if(head == NULL)
	{
		puts("no list\n");
		return NULL;
	}
	tmp = head->next;
	while(tmp!=NULL)
	{
		if(tmp->data == data)
		{
			break;
		}
		tmp = tmp->next;
	}
	return tmp;
}

pnode_t find_prev(pnode_t head,int data)
{	
	pnode_t tmp = NULL;
	if(head == NULL)
	{
		puts("no list\n");
		return NULL;
	}

	tmp = head;
	while(tmp->next!=NULL)
	{
		if(tmp->next->data == data)
		{
			return tmp;
		}
		tmp = tmp->next;
	}
	return NULL;	
}


//-----------------------插入------------------------------------
int insert_node_after(pnode_t p,pnode_t new)
{
	if(p == NULL || new == NULL)
	{
		return -1;
	}	
	new->next = p->next;
	p->next = new;
	return 0;
}
int insert_data_after(pnode_t p,int data)
{
	int ret = 0;
	pnode_t new = NULL;
	if(p == NULL)
	{
		return -1;
	}
	new = create_node(data);
	ret = insert_node_after(p,new);
	return ret;
}

int insert_data(pnode_t head,int data,int new_data)
{
	int ret = 0;
	pnode_t p = NULL;
	p = find_node(head,data);
	if(p==NULL)
	{
		return -1;
	}
	ret = insert_data_after(p,new_data);
	return ret;
}
int insert_prev(pnode_t head,int data,int new_data)
{
	int ret = 0;
	pnode_t p = NULL;
	p = find_prev(head,data);	
	if(p==NULL)
	{
		return -1;
	}
	ret = insert_data_after(p,new_data);
	return ret;
}








//-----------------------刪除------------------------------------
int del_after_node(pnode_t p)
{
		pnode_t tmp = NULL;
		if(p == NULL)
		{
			return -1;
		}
		tmp = p->next;		
		if(tmp!=NULL)
		{
			p->next = tmp->next;
			free(tmp);
		}
		return 0;
}


int del_data(pnode_t head,int data)
{
	int ret = 0;
	pnode_t p = find_prev(head,data);
	if(p != NULL)
	{
		ret = del_after_node(p);
	}
	return ret;
}
int del_after_data(pnode_t head,int data)
{
	int ret = 0;
	pnode_t p = find_node(head,data);
	if(p != NULL)
	{
		ret = del_after_node(p);
	}
	return ret;

}
int clear(pnode_t head)
{
	if(head == NULL)
	{
		return -1;
	}
	while(head->next != NULL)
	{
		del_after_node(head);
	}
	return 0;
}
int destroy(pnode_t* phead)
{
		if(phead == NULL)
		{
			return -1;
		}
		if(*(phead) != NULL)
		{
			clear(*phead);
			free(*phead);
		}
		*phead = NULL;
		return 0;
}






int main()
{
	int i = 0;
	int ret = 0;
	pnode_t head = NULL;
	head = create_list();
	for(i = 0;i<5;i++)
	{
		insert_data_after(head,i*3);
	}	
	print_list(head);
	printf("-----------------\n");
	insert_data(head,3,2);
	insert_prev(head,6,5);
	print_list(head);
	printf("----------------\n");
	del_data(head,5);
	del_data(head,2);
	print_list(head);
	destroy(&head);
	
	return 0;
}