单向循环链表

来源:互联网 发布:盟拓软件 编辑:程序博客网 时间:2024/05/22 05:27


//function declaration
/*******************************************************/
int KawaOneLoopLink_CreatLink(STU_S *pTemp);//创建链表
int KawaOneLoopLink_DestroyLink(STU_S *pTemp);//销毁链表
int KawaOneLoopLink_InserLink(STU_S *pTemp, STU_S student); //插入一个节点
int KawaOneLoopLink_FindElemIndex(STU_S student, int *OutIndex);//寻找一个满足数据元素的位序
int KawaOneLoopLink_DelLink(STU_S *pTemp, int num);//删除一个节点
int KawaOneLoopLink_GetDateNum(STU_S *pTemp, int *OutStudentNum);


void KawaOneLoopLink_PrintfLink(STU_S *pTemp);//打印链表
void KawaOneLoopLink_GetOneData(STU_DATA_S *stu_p);//输入一个学生信息
void KawaOneLoopLink_PrintfOneData(STU_DATA_S * stu_p); //输出一个学生信息



#include <stdio.h>

#include <string.h>
#include <stdlib.h>


#define true  1
#define false 0


#define SUCCESS  0
#define FAILURE -1


#define bool unsigned char


#define S32 int
#define U32 unsigned int  
#define U8  unsigned char


#define STU_LEN sizeof(STU_S)  //宏定义


typedef struct student_data
{
U32   Index; //学号
char  Name[20];//姓名 
float Score; //分数
int   Sex; //性别
}STU_DATA_S;


//声明学生结构
typedef struct student

STU_DATA_S data;
struct student * pnext;//指针域  指向下一个节点
}STU_S;


//global variable
/*******************************************************/
STU_S pHead;




//function declaration
/*******************************************************/
int  KawaOneLoopLink_CreatLink(STU_S *pTemp); //创建链表
int  KawaOneLoopLink_DestroyLink(STU_S *pTemp); //销毁链表
int  KawaOneLoopLink_InserLink(STU_S *pTemp, STU_S student);   //插入一个节点
int  KawaOneLoopLink_FindElemIndex(STU_S student, int *OutIndex);//寻找一个满足数据元素的位序
int  KawaOneLoopLink_DelLink(STU_S *pTemp, int num);//删除一个节点
int  KawaOneLoopLink_GetDateNum(STU_S *pTemp, int *OutStudentNum);




void KawaOneLoopLink_PrintfLink(STU_S *pTemp); //打印链表
void KawaOneLoopLink_GetOneData(STU_DATA_S *stu_p);//输入一个学生信息
void KawaOneLoopLink_PrintfOneData(STU_DATA_S * stu_p);  //输出一个学生信息




//输入一个学生
void KawaOneLoopLink_GetOneData(STU_DATA_S *stu_p)
{
printf("index:");
scanf("%d",&stu_p->Index);

printf("name:");
scanf("%s",stu_p->Name);


printf("sex:");
scanf("%d",&stu_p->Sex);

printf("soce:");
scanf("%f",&stu_p->Score);
}


//输出一个学生 
void KawaOneLoopLink_PrintfOneData(STU_DATA_S * stu_p)
{
printf("index:%d\n",stu_p->Index);
printf("name:%s\n",stu_p->Name);
printf("sex:%d\n",stu_p->Sex);
printf("soce:%.1f\n",stu_p->Score);
printf("\n");
}


//创建链表 这里头结点不存储数据
int KawaOneLoopLink_CreatLink(STU_S *pTemp)
{
if (pTemp == NULL)
{
return FAILURE;
}

memset(pTemp, 0, sizeof(STU_S));


pTemp.pnext = pTemp;


return SUCCESS;
}


//销毁链表
int KawaOneLoopLink_DestroyLink(STU_S *pTemp)
{
STU_S *pDel  = NULL;

if (pTemp == NULL)
{
return FAILURE;
}

while(pTemp->pnext != NULL)//找到最后一个没有存放下一个地址的那位
{
pDel = pTemp->pnext;
pTemp = pTemp->pnext;


if (pDel == NULL)
{
return FAILURE;
}

free(pDel);
pDel = NULL;
}

return SUCCESS;
}


//插入一个节点  使用尾插法 这里头结点不存储数据
int KawaOneLoopLink_InserLink(STU_S *pTemp, STU_S student)
{
while(pTemp->pnext != NULL)//找到最后一个没有存放下一个地址的那位
{
pTemp = pTemp->pnext;
}


pTemp->pnext = (STU_S *)malloc(STU_LEN);      //开辟一块储存空间等着装添加的学生信息


if (pTemp->pnext == NULL)
{
return FAILURE;
}


memcpy(pTemp->pnext,&student,STU_LEN);
pTemp->pnext->pnext = NULL;


return SUCCESS;
}


//判断链表是否为空,为空返回 true
int KawaOneLoopLink_IsEmptyLink(STU_S *pTemp)
{
if (pTemp == NULL)
{
return true;
}

if (pTemp->pnext == pTemp)//找到最后一个没有存放下一个地址的那位
{
return true;
}


return false;
}


//寻找一个满足数据元素的位序
int  KawaOneLoopLink_FindElemIndex(STU_S student, int *OutIndex)
{
int   index  = 0;
STU_S *pTemp = &pHead;


while(pTemp->pnext != NULL)//找到最后一个没有存放下一个地址的那位
{
pTemp = pTemp->pnext;


index ++;


if (student.data.Index == pTemp->data.Index)
{
*OutIndex = index;
}
}
}


//删除一个节点,num位0表示头结点,这里头结点不存储数据
int KawaOneLoopLink_DelLink(STU_S *pTemp, int index)
{
int   i      = 0;
STU_S *pDel  = NULL;
int   num    = 0;

if (pTemp == NULL)
{
return FAILURE;
}

KawaOneLoopLink_GetDateNum(pTemp, &num);


if (num == 0)
{
printf("The Link Is NULL\n");


return FAILURE;
}

//判断链表是否为空,为空不允许删除
if (pTemp->pnext == NULL)
{
return FAILURE;
}


if (index < 1)
{
return FAILURE;
}


//如果不为空,就开始查找对应的节点
for (i = 0; i < index - 1; i++)             //找到要删除的节点前面那位
{
pTemp = pTemp->pnext;
}


pDel = pTemp->pnext;                       //就是要删除的节点
pTemp->pnext = pDel->pnext;                //把删除节点后面的节点的地址给删除节点 


if (pDel != NULL)
{
free(pDel);  //把删除的节点的地址释放
}
                             
return SUCCESS;
}


//查询数据个数
int KawaOneLoopLink_GetDateNum(STU_S *pTemp, int *OutStudentNum)
{
int   num    = 0;


if (pTemp == NULL || OutStudentNum == NULL)
{
return FAILURE;
}


*OutStudentNum = 0;

while(pTemp->pnext != NULL)
{
num ++;
*OutStudentNum = num;


pTemp=pTemp->pnext;            
}


return SUCCESS;
}


//打印链表 遍历整个链表,打印所有信息
void KawaOneLoopLink_PrintfLink(STU_S *pTemp)
{
int num = 0;

if (pTemp == NULL)
{
return;
}

KawaOneLoopLink_GetDateNum(pTemp, &num);


if (num == 0)
{
printf("The Link Is NULL\n");


return;
}

while(pTemp->pnext != NULL)
{
pTemp=pTemp->pnext;            //pnext是变量里面放的是下一个数据的地址
KawaOneLoopLink_PrintfOneData(&pTemp->data);
}
}


int main(void)
{
int Index = 0;
STU_S stStuinfo1;


KawaOneLoopLink_CreatLink(&pHead);  

while (1)
{
printf("(1) add a student\n");
printf("(2) delete a student\n");
printf("(3) printf student\n");
printf("(4) exit()\n");

scanf("%d",&Index);


if (Index == 1)
{
KawaOneLoopLink_GetOneData(&stStuinfo1.data);
KawaOneLoopLink_InserLink(&pHead,stStuinfo1); 
}
else if (Index == 2)
{
KawaOneLoopLink_DelLink(&pHead, 1); 
}
else if (Index == 3)
{
KawaOneLoopLink_PrintfLink(&pHead);
}
else if (Index == 4)
{
KawaOneLoopLink_DestroyLink(&pHead); 


return 0;
}    


}


return 0;
}