循環單鏈表

//函數聲明部分:"CirLinkList.h"

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct linknode
{
	ElemType data;
	struct linknode *next;
}node;

void judgement_NULL(node * p);         //判斷動態內存是否開闢成功

node * creat_order();                  //創建循環鏈表

void insert(node *head, int i, ElemType x);          //在i位置上插入一個值爲x的結點

void delete(node *head, int i);                     //刪除i位置的結點

void find(node *head, ElemType x);                  //尋找只爲x的結點位置

void length_list(node *head);         

void output(node * head);                          //打印整個鏈表

void inits_linklist(node *head);                //釋放整個鏈表

void sortrank(node *head);                      //對整個鏈表進行排序




//函數實現:"CirLinkList.c"

#include"CirLinkList.h"
void judgement_NULL(node * p)         //判斷動態內存是否開闢成功,若是失敗,程序直接結束
{
	if (p == NULL)
	{
		perror("out of memory\n");
		exit(EXIT_FAILURE);
	}
}

node * creat_order()                           //建立一個循環單鏈表
{
	printf("請建立循環鏈表:");
	node *head, *p, *r;
	ElemType x;
	head = (node *)malloc(sizeof(node));
	judgement_NULL(head);
	r = head;
	head->next = NULL;
	while (1)
	{
		scanf("%d", &x);
		if (x != 0)
		{
			p = (node *)malloc(sizeof(node));
			judgement_NULL(p);
			p->data = x;
			r->next = p;      
			r = p;
		}
		else
			break;
	}
	r->next = head;                      //讓最後一個結點的指針域指向頭結點
	printf("建立成功\n");
	return head;
}

void insert(node *head, int i, ElemType x)           //在i位置上插入一個元素x
{
	node *p, *r, *q;
	p = (node *)malloc(sizeof(node));
	judgement_NULL(p);
	p->data = x;
	r = head;
	while (1)                           //由於是循環鏈表,因此輸入的位置只要i>1,就必定會有一個位置能夠插入
	{
		if (i<=1)                      //順着鏈表循環,直到i--到1
			break;
		r = r->next;
		i--;
	}
	if (i < 1)
		printf("沒有這個結點\n");
	else
	{
		q = r->next;                       //從頭結點以後開始插入
		r->next = p;
		p->next = q;
		printf("插入成功\n");
	}
}

void delete(node *head, int i)                             //刪除鏈表中i位置的結點
{
	node *p, *q;
	p = head;
	while (1)                                          //循環整個鏈表,直到i--到1
	{
		if (i <= 1)
			break;
		p = p->next;
		i--;
	}
	if (i<1)
		printf("沒有該結點\n");
	else
	{
		if (p->next== head)                    //若是找到要刪除的結點是頭結點,則跳過刪除下一個結點
		{
			p = head->next;
			head->next = p->next;
			free(p);
		}
		else
		{
			q = p->next;
			p->next = q->next;
			free(q);
			q = NULL;
		}
	   printf("刪除成功\n");
	}
}


void find(node *head, ElemType x)                   //查找值爲x的元素所在結點位置
{
	head = head->next;
	node *p;
	int count = 1;
	if (head->data == x)
		printf("結點位置:1");
	else
	{
		p = head->next;
		while (p != head)
		{
			count++;
			if (p->data == x)
				break;
			else
				p = p->next;
		}
		if (p == head)
			printf("沒有這個結點\n");
		else
			printf("結點位置:%d\n", count);
	}
}

void length_list(node *head)                                 //求取循環鏈表的結點個數
{
	int len = 0;
	if (head->next == NULL)
	{
		printf("鏈表爲NULL\n");
	}
	else
	{
		node *p = head->next;
		while (p != head)
		{
			len++;
			p = p->next;
		}
		printf("鏈表長度:%d\n", len);
	}
}

void output(node * head)                                           //打印循環鏈表
{
	node *p;
	if (head == NULL)
		printf("鏈表爲空\n");
	else
	{
		printf("打印鏈表:");
		p = head->next;
		while (p != head)
		{
			printf("%d ", p->data);
			p = p->next;
		}
		printf("\n");
	}
}

void inits_linklist(node *head)    //初始化鏈表
{
	node *p,*r;
	p = head->next;
	while (p !=head)
	{
		r = p;
		p = p->next;
		free(r);
		r = NULL;
	}
	free(head);
	head = NULL;
	printf("初始化成功\n");
}


void sortrank(node *head)                       //對整個鏈表進行排序
{
	node *p, *r;
	ElemType tmp;
	p = head->next;
	while (p->next != head)
	{
		r = head->next;
		while (r->next != head)
		{
			if ((r->data) >(r->next->data))
			{
				tmp = r->data;
				r->data = r->next->data;
				r->next->data = tmp;
			}
			r = r->next;
		}
		p = p->next;
	}
	printf("排序成功\n");
}






//函數測試部分:

#include"CirLinkList.h"

int main()
{
	printf("*****************************************\n");
	printf("*****************************************\n");
	printf("**1.Creat_LinkList    2.Insert_Element **\n");
	printf("**3.Find              4.Delete_Element **\n");
	printf("**5.Length_LinkList   6.Output_LinkList**\n");
	printf("*7.InitsLinkLinst     8.Sortrank       **\n");
	printf("*0.Exit               *******************\n\n\n");

	node *ret = NULL;
	ElemType x;
	int i = 0;
	int n = 0;

	while (1)                                      //循環起來,直到選擇0結束
	{
		printf("請選擇功能:");
		scanf("%d", &n);
		if (n == 0)                //當選擇功能時,選擇0的優先級最高,無條件退出
		{
			free(ret);
			exit(1);
		}
		if (n == 1 && ret == NULL)             //只有當前沒建立鏈表,並且ret爲空時,n==1時,建立鏈表纔有效
		{
			ret = creat_order();
		}
		else if (n != 1 && ret == NULL)
			printf("\n鏈表爲NULL,請創建鏈表\n\n");
		else if (ret != NULL)                             //當建立鏈表以後這些語句纔有效
		{
			switch (n)
			{
			case 2:                            //鏈表的末尾也能夠插入元素
				printf("請輸入要插入的位置和要插入的元素\n"); 
				scanf("%d", &i);
				scanf("%d", &x);
				insert(ret,i,x);
				break;
			case 3:
				printf("請輸入要查找的元素:");
				scanf("%d", &x);
				find(ret,x);
				break;
			case 4:
				printf("請輸入要刪除的位置:");
				scanf("%d", &i);
				delete(ret, i);
				break;
			case 5:
				length_list(ret);
				break;
			case 6:                           //打印鏈表
				output(ret);
				break;
			case 7:
				inits_linklist(ret);
				ret = NULL;
				break;
			case 8:
				sortrank(ret);
				break;
			default:
				printf("選擇無效,請從新選擇\n");
				break;
			}                                   //switch()語句結束
		}

	}
	system("pause");
	return 0;
}
相關文章
相關標籤/搜索