循环单向链表

/**
循环单项链表
*/
#ifndef LINKSCLIST_H_
#define LINKSCLIST_H_


#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include"head.h"


typedef  int ElemType;


typedef struct Node{
ElemType data;
struct Node *next;
}Node;


typedef struct LinkSCList{
int len;
struct Node *head;
struct Node *tail;
}LinkSCList;


boolean InitSCList(LinkSCList **head);
boolean DestroySCList(LinkSCList **head);
boolean ClearSCList(LinkSCList *head);
boolean DelFirst(LinkSCList *head);
boolean Append(LinkSCList *head,ElemType data);
boolean Remove(LinkSCList *head,ElemType data);
boolean InsBefore();
boolean InsAfter();
boolean SetCurElem();
ElemType GetCurElem();
boolean ListEmpty(LinkSCList *head);
int ListLen(LinkSCList *head);
Node*  GetHead(LinkSCList *head);
Node*  GetLast(LinkSCList *head);
Node *PriorPos();
Node *NextPos();
boolean LocatePos(LinkSCList *head,int index,ElemType *v);
/*
index 有效下标值(0--length-1)
v  接收返回数据
*/
boolean LocatePos(LinkSCList *head,int index,ElemType *v)
{
boolean OK = TRUE;


int i;
Node *p = head->head;


if(index<0 || index>=head->len)
return FALSE;
for(i=0; i<index; i++)
{
p = p->next;
}
(*v) = p->data;


return OK;
}
Node *NextPos()
{


}
Node *PriorPos()
{
}
Node *GetLast(LinkSCList *head)
{
return head->tail;
}
Node *GetHead(LinkSCList *head)
{
return head->head;
}
int ListLen(LinkSCList *head)
{
return head->len;
}
boolean ListEmpty(LinkSCList *head)
{
return head->len ? 1 : 0;
}
ElemType GetCurElem()

}
boolean SetCurElem()
{
}
boolean InsAfter()
{
}
boolean InsBefore()
{
}
/*
删除第一个和data一样的数据
*/
boolean Remove(LinkSCList *head,ElemType data)
{
Node *p = head->head,*q;


if(head->len<=0)
return FALSE;
do
{
if(p->data==data)
{
if(p==head->head)
{
head->head = p->next;
head->tail->next = p->next;
}
else
{
q->next = p->next;
}
free(p);
return TRUE;
}
q = p;
p = p->next;
}while(p==head->tail);


return FALSE;
}
/*
每次将数据添加到链表的最后一个
*/
boolean Append(LinkSCList *head,ElemType data)
{
Node *p;
boolean OK = TRUE;


if( !(p=(Node *)malloc(sizeof(Node))) )
OK = FALSE;
else
{
p->data = data;
p->next = NULL;


if(head->head == NULL)
{
head->head = p;
head->tail = p;
head->tail->next = head->head;
}
else
{
head->tail->next = p;
head->tail = p;
head->tail->next = head->head;
}
++head->len;
}


return OK;
}
/*
删除链表中表头的元素
*/
boolean DelFirst(LinkSCList *head)
{
boolean OK = TRUE;
Node *p;


if(head->head == NULL)
OK = FALSE;
if(head->len > 1)
{
--(head->len);
p = head->head;
head->head = p->next;
head->tail->next = head->head;
free(p);
}
else
{
free(head->head);
head->head = NULL;
head->tail = NULL;
--(head->len);
}


return OK;
}
/*
清除链表中所有的元素,
并初始化表头
*/
boolean ClearSCList(LinkSCList *head)
{
boolean OK = TRUE;
Node *p,*q;

if(head == NULL)
OK = FALSE;
else
{
if((head->head) != NULL)
{
q = head->head;
do
{
p = q->next;
free(q);
q = p;
}while(q!=head->tail && q!=NULL);
}
head->len = 0;
head->head = NULL;
head->tail = NULL;
}


return OK;
}
boolean DestroySCList(LinkSCList **head)
{
boolean OK = TRUE;
LinkSCList *h = (*head);
Node *p,*q;

if((*head) == NULL)
OK = FALSE;
else
{
if((h->head) != NULL)
{
q = p = h->head;
do
{
p = q->next;
free(q);
q = p;
}while(q!=h->tail && q!=NULL);
}
free(*head);
(*head) = NULL;
}


return OK;
}
boolean InitSCList(LinkSCList **head)
{
boolean OK = TRUE;


if(*head)
OK = FALSE;
else
{
(*head) = (LinkSCList *)malloc(sizeof(LinkSCList));


(*head)->len = 0;
(*head)->head = NULL;
(*head)->tail = NULL;
}


return OK;
}
/*
void main(void)
{
int i;
Node *p;
ElemType v[3] = {1,2,3},v1;
LinkSCList *head = NULL;
InitSCList(&head);
for(i=0; i<3; i++)
{
Append(head,v[i]);
}
// ClearSCList(head);
printf("%d\n",LocatePos(head,4,&v1));
printf("剩余元素个数:%d",ListLen(head));
getch();
}
*/
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值