单向循环链表

#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#define ERROR 0
#define FALSE 0
typedef int ElemType; 

//单项循环链表  也就是最后一个元素指向头指针 
typedef struct LNode{
	ElemType data;
	LNode *next; 
}Node,*CcLink; 
//create 带头结点clink 
CcLink CreateCcLink(CcLink head){
	head = (CcLink)malloc(sizeof(CcLink));
	if(NULL == head){
		printf("init Clink failed");
		exit(ERROR);
	}
	head->data = 0;
	head->next = head;
	return head;
}
//指定init
void InitCcLink(CcLink head){
	Node *pNode = NULL;
	int n;
	ElemType e;
	CcLink temp = head; 
	printf("input the length of CLink:");
	scanf("%d",&n);
	for(int i= 1;i<=n;i++){
		pNode = (Node *)malloc(sizeof(Node));
		if(NULL==pNode){
			printf("init node failed");
			exit(ERROR);
		}
		printf("input element %d:",i);
		//scanf elem 
		scanf("%d",&e);
		pNode->data = e;
		pNode->next = head;
		temp->next = pNode;
		temp = pNode;
	}
	//return head;
}
//length
void CcLength(CcLink head){ 
	
	int count = 0;
	CcLink temp = head->next;
	while(temp != head){
		count ++;
		temp = temp->next;
	}
	printf("Link length: %d\n",count);
} 

//get Value 
void GetElem(CcLink head){
	ElemType e;
	int i = 1,pos;
	printf("input the pos of search:");
	scanf("%d",&pos);
	//should have a judge whether Link is empty ?
	CcLink temp = head->next;
	while(temp != head){
		if(i == pos){
			printf("got it!\n");
			e = temp->data;
			break;
		}
		else
			temp = temp->next;
		i++;
	}
	if(temp == head){
		printf("there is no such elem in CcLink .....");
		exit(FALSE);
		//return;
	}
	printf("the elem of %d pos is : %d\n",pos,e);
} 
//insert
void InsertValue(CcLink head){
	int pos;
	ElemType e;
	Node *pNode = NULL;
	pNode = (Node *)malloc(sizeof(Node));
	printf("input the pos of insert:");
	scanf("%d",&pos);
	CcLink temp = head;
	for(int i = 0;i<=pos;i++){
		/*if(NULL == head->next){
			printf("link is null!!!");
			exit(ERROR); 
		}
		if(head == head->next){
			printf("link is empty!!!");
			exit(ERROR);
		}*/
		//head = head->next;
		if(i == pos-1){
			printf("input the elem:");
			//scanf elem 
			scanf("%d",&e);
			pNode->data = e;
			pNode->next = temp->next;
			temp->next = pNode;
			break;
		}
		else{
			temp = temp->next;
			//ttemp = ttemp->next;
		}
			
	}
}
//delete
void DeleteElemByValue(CcLink head){
	ElemType e;
	int i;
	CcLink temp = head->next,ttemp = head;
	printf("input the Elem to delete:");
	scanf("%d",&e); 
	while(temp != head){ 
		if(temp->data == e){
			ttemp->next = ttemp->next->next;
			free(temp);
			return;
		}
		else{
			temp = temp->next;
			ttemp = ttemp->next;//记录上一个位置
		}
	} 
	if(temp == head){
		printf("no such elem in Link");
		exit(FALSE);
	}
}
//类似insert 
void DeleteElemByPos(CcLink head){
	int pos,i;
	printf("input the pos to delete:");
	scanf("%d",&pos); 
	CcLink temp = head;
	//移动pos-1次到pos的前一个位置 
	for(i = 1;i<pos;i++){  //pos = 3 i = 1;p=1/ i = 2; p =2..i=3 
		temp = temp->next;
	}
	temp->next = temp->next->next;
}
//destroy
void DestroyCcLink(CcLink *head){
    CcLink temp = NULL;
	while((*head)->next != (*head))  
    {
		temp = (*head)->next->next;
        free((*head)->next);
        (*head)->next = temp;
    }
    printf("let's gc head!\n");
    free(*head);
    *head = NULL;//防止野指针出现
    printf("destroy CcLink success!  you are the best!");
} 
//打印链表
void TraverseCcLinkList(CcLink head)
{
	CcLink temp = head->next;
	printf("链表打印如下:");
	while (temp != head)
	{
		printf("%d ", temp->data);
		temp = temp->next;
	}
	printf("\n");
}

//清空链表。GetPreElem Next。IsEmpty。等等 总之 只要能掌握链表的数据结构 稍加思考 功能都能写出来 
int main(){
	CcLink head = NULL;
	head = CreateCcLink(head);
	InitCcLink(head);
	TraverseCcLinkList(head);
	
	CcLength(head);
	TraverseCcLinkList(head);
	
	GetElem(head);
	TraverseCcLinkList(head);
	
	InsertValue(head);
	TraverseCcLinkList(head);
	
	DeleteElemByValue(head);
	TraverseCcLinkList(head);
	
	DeleteElemByPos(head);
	TraverseCcLinkList(head);
	
	DestroyCcLink(&head);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值