循環鏈表企業鏈表

一、特點
讓鏈表的最後一個結點的next指針指向頭結點。初始化小節點時直接讓next指針指向鏈表的頭結點。
二、代碼

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//小結點
typedef struct LISTNODE
{
	LISTNODE *next;
}ListNode;
//鏈表結點
typedef struct CIRCULARLIST
{
	ListNode head;
	int size;
}CircularList;

//數據
typedef struct PERSON
{
	ListNode node;
	char name[20];
	int age;
}person;
//輸出函數指針
typedef void(*PRINT)(ListNode*);
void MyPrint(ListNode* data)
{
	person* p = (person*)data;
	printf("name: %s , age: %d \n",p->name,p->age);
}
//比較函數指針
typedef int(*COMPARED)(ListNode*,ListNode*);
int mycompared(ListNode* data1 ,ListNode* data2)
{
	person* p1 = (person*)data1;
	person* p2 = (person*)data2;
	if(p1->age == p2->age && strcmp(p1->name,p2->name) == 0)
	{
		return 0;
	}
	else 
		return -1;
}
//循環鏈表初始化
CircularList* Init_CircularList()
{
	CircularList* list = (CircularList*)malloc(sizeof(CircularList));
	list->head.next = &(list->head);   //讓頭結點的next指向自己
	list->size = 0;
	return list;
}
//循環鏈表的插入
void insert_circularList(CircularList* list , int pos ,ListNode* data)
{
	//判斷
	if(list==NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		pos = list->size; //優化處理
	}
	//插入
	data->next = &(list->head);
	ListNode* pcur1 = &(list->head);
	for(int i = 0 ; i < pos ; i++)
	{
		pcur1 = pcur1->next;
	}
	data->next = pcur1->next;
	pcur1->next = data;
	list->size++;
}
//循環鏈表的值刪除
void valuedelete(CircularList* list,ListNode* data,COMPARED mycompared)
{
	//判斷
	if(list == NULL)
	{
		return;
	}
	if(data == NULL)
	{
		return;
	}
	//刪除
	ListNode* pcur1 = &(list->head);
	ListNode* pcur2 = NULL;
	int flag = -1;
	for(int i=0; i<list->size; i++)
	{
		pcur2 = pcur1->next;
		flag = mycompared(pcur2,data);
        if(flag == 0)
		{
			break;
		}
		else
			pcur1=pcur1->next;
	}
	if(flag == -1)
	{
		printf("該數據不存在\n");
	}
	else
	{
	    pcur1->next = pcur2->next;
	    list->size--;
	}
}
//循環鏈表的位置刪除
void posdelete(CircularList* list , int pos)
{
	//判斷
	if(list == NULL)
	{
		return;
	}
	if(pos<0||pos>list->size)
	{
		printf("pos有誤,請重新輸入");
		return;
	}
	//刪除
	ListNode* pcur = &(list->head);
	for(int i = 1;i<pos;i++)
	{
		pcur = pcur->next;
	}
	pcur->next = pcur->next->next;
	list->size--;
}
//循環鏈表的打印
void print_circularList(CircularList* list , PRINT MyPrintf)
{
	//判斷
	if(list == NULL)
	{
		return;
	}
	//打印
	ListNode* pcur = list->head.next;
	for(int i = 0 ; i < (list->size)*2 ; i++)    //循環的次數  (list->size)*2
	{
		MyPrintf(pcur);
		pcur = pcur->next;
		if(pcur == &(list->head))
		{
			pcur = pcur->next;
		}
	}
}
//循環鏈表的長度
int size_circular(CircularList* list)
{
	printf("size: %d\n",list->size);
	return 0;
}
//兩個循環鏈表的合併
void twolist(CircularList* list1 ,CircularList* list2)
{
	//判斷
	if(list1 == NULL || list2 == NULL)
	{
		return;
	}
	//合併
	ListNode* list1_lastNode = list1->head.next;  //list1的最後一個結點
	for(int i = 1 ; i<list1->size ; i++)
	{
		list1_lastNode = list1_lastNode->next;
	}

	ListNode* list2_lastNode = list2->head.next;  //list2的最後一個結點
	for(int i = 1 ; i<list2->size ; i++)
	{
		list2_lastNode = list2_lastNode->next;
	}

	list1_lastNode->next = list2->head.next;    //將list1的最後一個結點指向list2第一個結點
	list2_lastNode->next = &(list1->head);      //將list2最後一個結點指向list1的頭結點
	list1->size = list1->size + list2->size;   //長度
}
//循環鏈表的清空
void emptyList(CircularList* list)
{
	//判斷
	if(list ==NULL)
	{
       return;
	}
	list->size = 0;
}
//循環鏈表的內存釋放
void FreeSpace(CircularList* list)
{
	if(list == NULL)
	{
		return;
	}
	free(list);
}
int main()
{
	//創建循環鏈表
	CircularList* list = Init_CircularList();
	CircularList* list2 = Init_CircularList();
	//創建數據
	person p1, p2, p3;
	strcpy_s(p1.name,"aaa");
	strcpy_s(p2.name,"bbb");
	strcpy_s(p3.name,"ccc");
	p1.age = 21;
	p2.age = 22;
	p3.age = 23;
	 
	person p4, p5, p6;
	strcpy_s(p4.name,"ddd");
	strcpy_s(p5.name,"eee");
	strcpy_s(p6.name,"fff");
	p4.age = 21;
	p5.age = 22;
	p6.age = 23;

	//插入
	insert_circularList(list,1,(ListNode*)&p1);
	insert_circularList(list,1,(ListNode*)&p2);
	insert_circularList(list,1,(ListNode*)&p3);

	insert_circularList(list2,1,(ListNode*)&p4);
	insert_circularList(list2,1,(ListNode*)&p5);
	insert_circularList(list2,1,(ListNode*)&p6);
	//打印
	print_circularList(list,MyPrint);
	//循環鏈表的長度
	size_circular(list);
	print_circularList(list2,MyPrint);
	size_circular(list);

	twolist(list,list2);
	print_circularList(list,MyPrint);
	size_circular(list);
	//位置刪除
	//posdelete(list,2);
	//print_circularList(list,MyPrint);

	//值刪除
	//person p4;
	//strcpy_s(p4.name,"bbb");
	//p4.age = 22;
	//valuedelete(list,(ListNode*)&p4,mycompared);
	//print_circularList(list,MyPrint);
	//size_circular(list);

	//釋放內存
	FreeSpace(list);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章