#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;
}
单向循环链表
最新推荐文章于 2024-06-11 10:00:00 发布