数据结构的创建基本链表



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

#include"common.h"

LinkList *CreateLinkList()
{
 LinkList *list;  //定义结构体指针list

 list = (LinkList *)malloc(sizeof(LinkList));//开辟一个空间size大小为结构体大小
 if ( list = =NULL)//判断空间是否开辟成功
 {
  perror("CreateLinkList->malloc");
  return NULL;
 }
 memset(list ,0 ,sizeof(LinkList)); //对新开辟的空间进行数据初始化
 printf("%s-%s-%d---------\n",__FILE__,__FUNCTION__,__LINE__);
  //打印文件名,所在的函数以及所在行数
 list->next = NULL;//成的空间里的next指针成员为空

 return list;//返回list表格
}

void ClearLinkList(LinkList *list)//定义清空表格函数功能
{
 int i;
 LinkList *p;
 LinkList *q;//定义变量
 if(list == NULL)//判断表格是否为空
  printf("list error!\n");
 p=list->next;//p指针存放结构体next成员存储值
 list->next=NULL;//next成员为空


 while(p != NULL)//在p指针不为空的情况下,将p的指针内容赋值给q;
   //再将p指针指向下一个空间,释放q指针指向空间
   //q赋为空,防止成为野指针
 {
  q = p;
  p = p->next;
  free(q);
  q = NULL;
 }
}

int FullLinkList(LinkList *list)//判断表格是否为满
{
 return 0;
}

int EmptyLinkList(LinkList *list)
{
 return list->next == NULL;
}

int LengthLinkList(LinkList *list)//计算表格长度
{
 int len;
 LinkList *p = list ;
 
 len = 0;
 while(p->next != NULL)//在链表next成员变量不为空的情况下执行循环
 {
  len ++;
  p = p->next;//p指针按链表顺序移动
 }
 return  len;
}

int InsertLinkList(LinkList *list, int local, data_t data)
{
 int i;
 LinkList *p;
 LinkList *q;
 
 if(local < 0 || local > LengthLinkList(list));//判断插入位置是否有效
 {
  printf("local error \n");
  return -1;
 }
 
 q = malloc(sizeof(LinkList));//开辟空间
 if( q = NULL)//判断空间是否开辟成功
 {
  perror("InsertLinkList->malloc");
  return -1;
 }
 memset(q ,0 ,sizeof(LinkList));//空间初始化
 q->data=data;//把内容装入链表
 q->next=NULL;

 p = list;//查找需要插入的位置
 for(i=0;i < local ;i++)
  p = p->next;

 q->next = p->next;//将新开辟空间的地址存入上个格子的next成员
 p->next = q;

 return 0;

}

int DeleteLinkList(LinkList *list ,int local)
(

 int i;
 LinkList *p=list;
 LinkList *q;

 if(EmptyLinkList(list))//判断是否为空
 {
  printf("linklist is empty!\n")
  return -1;
 }
 if(local<0 || local > LengthLinkList(list))//判断删除位置是否存在
 {
  printf("local error !\n");
  return -1;
 }
 for(i = 0;i < local-1;i++)//找到需要删除的前一个节点locai-1
  p = p->next;
 q = p->next;//q指针指向local节点
 p->next = q->next;//local-1节点赋next成员存储local+1节点的首地址
 free(q);//释放local节点空间
 q = NULL;

 return 0;
}

int SearchLinkList(LinkList *list,int local, data_t *data)
{

 int i;
 LinkList *p = list->next;
 
 if(EmptyLinkList(list))//判断链表是否为空
 {
  printf("linklist is empty!\n")
  return -1;
 }
 if(local<0 || local > LengthLinkList(list))//判断搜寻位置是否存在
 {
  printf("local error !\n");
  return -1;
 }
 for(i = 0;i<local;i++)//指针指向local节点
  p=p->next;
 
 *data = p->data;//将local节点data成员内容给data

}

int ChangLinkList(LinkList *list ,int local,data_t *data)
{
 int i;
 LinkList *p=list->next;

 if(EmptyLinkList(list))//判断链表是否为空
 {
  printf("linklist is empty!\n")
  return -1;
 }
 if(local<0 || local > LengthLinkList(list))//判断插入地址是否存在
 {
  printf("local error !\n");
  return -1;
 }

 for(i=0;i<local;i++)
  p=p->next;

 p->data = data;
}

void printLinkList(LinkList *list)
{

 LinkList *p = list;
 
 while(p->next!=NULL)//循环打印输出
 {
  p = p->next;
  printf("%d",p->data;
 }
 printf("\n");
}


void FreeLinkList(LinkList **list)
{
 ClearLinkList( *list);
 free(list);
 list=NULL;
}

int LocateLinkList(LinkList *list,data_t data)
{
 
 int i=0;
 LinkList *p=list->next;

 if(EmptyLinkList(list))//判断链表是否为空
 {
  printf("linklist is empty!\n")
  return -1;
 }

 while(p->next != NULL)
 {
  i++;
  if(p->data==data)
  {
   printf("%d",i);
  }
  p=->next;
 }
 
}



common.h

#ifndef _COMMON_H
#define _COMMON_H

typedef int data_t;


typedef struct linklist
{
 data_t data;
 struct linklist *next;
}LinkList;

LinkList *CreateLinkList();
void ClearLinkList(LinkList *list);
int FullLinkList(LinkList *list);
int EmptyLinkList(LinkList *list);
int LengthLinkList(LinkList *list);
int InsertLinkList(LinkList *list,int local,data_t data);
int DeleteLinkList(LinkList *list,int local);
int SearchLinkList(LinkList *list,int local,data_t data);
int ChangeLinkList(LinkList *list,int local,data_t data);
void  printLinkList(LinkList *list);
void  FreeLinkList(LinkList **list);
int   LocatdLinkList(LinkList *list ,data_t data);

#endif









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值