单向循环链表
来源:互联网 发布:盟拓软件 编辑:程序博客网 时间: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;
}
阅读全文
0 0
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 循环单向链表
- 单向循环链表
- 循环单向链表
- 单向链表循环
- 循环单向链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表
- 单向循环链表反转
- 单向循环链表C++
- 单向不循环链表
- 【SpringCloud】(十四):Feign对Hystrix的支持 fallbackFactory
- window10安装nodejs出现2503,2502错误的解决方法
- 【二分图匹配入门专题1】A
- Mysql联表查询、查询近期某段时间内的数据等
- 设计模式——工厂方法模式
- 单向循环链表
- Java中Vector和ArrayList的区别
- HDU 1087
- android境外支付
- Java基础总结
- hpuoj【1391】矩阵A+B【数组】&&【水题】
- 这么多中小企业就被人遗忘了吗?
- build opencv hdf module 配置hdf5路径
- 《成功习惯养成,总结》