数据结构---单链表c实现

#include <stdio.h>
#include <stdlib.h>
#define NN 12
#define MM 20
typedef int elemType;
struct sNode {
 elemType date;
 struct sNode *next;
};
/*                            函数定义                              */
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(struct sNode* *hl);
/* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(struct sNode* *hl);
/* 3.返回单链表的长度 */
int sizeList(struct sNode *hl);
/* 4.检查单链表是否为空,若为空则返回1,否则返回0 */
int emptyList(struct sNode *hl);
/* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElem(struct sNode *hl, int pos);
/* 6.遍历一个单链表 */
void traverseList(struct sNode *hl);
/* 7.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType* findList(struct sNode *hl, elemType x);
/* 8.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int updatePosList(struct sNode *hl, int pos, elemType x);
/* 9.向单链表的表头插入一个元素 */
void insertFirstList(struct sNode* *hl, elemType x);
/* 10.向单链表的末尾添加一个元素 */
void insertLastList(struct sNode* *hl, elemType x);
/* 11.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
int insetPosList(struct sNode* *hl, int pos, elemType x);
/* 12.向有序单链表中插入元素x结点,使得插入后仍然有序 */
void insertOrderList(struct sNode* *hl, elemType x);
/* 13.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
elemType deleteFirstList(struct sNode* *hl);
/* 14.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
elemType deleteLastList(struct sNode* *hl);
/* 15.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
elemType deletePosList(struct sNode* *hl, int pos);
/* 16.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
int deleteValueList(struct sNode* *hl, elemType x);
/*                            函数实现                              */
/* 1.初始化线性表,即置单链表的表头指针为空 */
void initList(struct sNode* *hl)
{
 *hl = NULL;
 return ;
}
/* 2.清除线性表L中的所有元素,即释放单链表L中所有的结点,使之成为一个空表 */
void clearList(struct sNode* *hl)
{
 struct sNode *cp,*np;
 cp = *hl;
 if(!emptyList(*hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return ;
 }
 while(cp != NULL)
 {
  np = cp->next;
  free(cp);
  cp = np;
 }
 *hl=NULL;
}
/* 3.返回单链表的长度 */
int sizeList(struct sNode *hl)
{
 int count=0;
 if(!emptyList(hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 while(hl!=NULL)
 {
  count++;
  hl = hl->next;
 }
 return count;
}
/* 4.检查单链表是否为空,若为空则返回1,否则返回0 */
int emptyList(struct sNode *hl)
{

 if(hl != NULL)
 {
  return 0;
 }
 else
 {
  return 1;
 }
}
/* 5.返回单链表中第pos个结点中的元素,若pos超出范围,则停止程序运行 */
elemType getElem(struct sNode *hl, int pos)
{
 int count=0;
    if(!emptyList(hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 while(hl != NULL)
 {
  count++;
  if( pos == count)
  {
   break;
  }
  hl = hl->next;
 }
 if( count == 0 )
 {
  printf("此为空链表,退出程序!");
  exit(1);
 }
 return hl->date;
}
/* 6.遍历一个单链表 */
void traverseList(struct sNode *hl)
{
 if(!emptyList(hl))
 {
  printf("空链表,请退出重新选择!");
  getchar();
  getchar();
  return ;
 }
 while( hl != NULL)
 {
  printf("%d ",hl->date);
  hl = hl->next;
 }
 return ;
}
/* 7.从单链表中查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL */
elemType* findList(struct sNode *hl, elemType x)
{
 if(!emptyList(hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 while ( hl != NULL)
 {
  if( hl->date == x)
  {
   return &hl->date;
  }
  hl = hl->next;   
 }
 return NULL;
}
/* 8.把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 */
int updatePosList(struct sNode *hl, int pos, elemType x)
{
 int count = 0;
 if(!emptyList(hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 while ( hl != NULL)
 {
  count++;

  if( pos == count)
  {
   hl->date = x;
   return 1;
  }
  hl = hl->next;
 }
 return 0;
}
/* 9.向单链表的表头插入一个元素 */
void insertFirstList(struct sNode* *hl, elemType x)
{
    struct sNode *newP;
 newP = malloc(sizeof(struct sNode));
    if(newP == NULL)
 {
  printf("内存分配失败,退出运行!");
  exit(1);
 }
    newP->date = x;
 newP->next = *hl;
 *hl = newP;
    return ;
}
/* 10.向单链表的末尾添加一个元素 */
void insertLastList(struct sNode* *hl, elemType x)
{
 struct sNode *newP;
 newP = malloc(sizeof(struct sNode));
 if(newP == NULL)
 {
  printf("内存分配失败,退出运行!");
  exit(1);
 }
 newP->date = x;
 newP->next = NULL;
 if(*hl == NULL)
 {
  *hl = newP;
 }
 else
 {
       struct sNode *p = *hl;
       while(p->next != NULL)
    {
      p = p->next;
    }
    p->next = newP;
 }
 return;
 
}
/* 11.向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 */
int insetPosList(struct sNode* *hl, int pos, elemType x)
{
 int i = 0;
 struct sNode *newP;
 struct sNode *cp = *hl, *ap = NULL;
 if(!emptyList(*hl))
 {
  printf("原线性表为空,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 if(pos <= 0)
 {
  printf("pos值非法,返回0表示插入失败!");
  return 0;
 }
 while(cp != NULL)
 {
  i++;
  if(pos == i)
  {
   break;
  }
  else
  {
   ap = cp;
   cp = cp->next;
  }
 }
  newP = malloc(sizeof(struct sNode));
  if(newP == NULL)
  {
   printf("内存分配失败,无法进行插入操作!");
   return 0;
  }
  newP->date = x;
  if(ap == NULL)
  {
    newP->next = cp;
    *hl = newP;
  }
  else
  {
   newP->next = cp;
   ap->next = newP;
  }
      return 1;
}
/* 12.向有序单链表中插入元素x结点,使得插入后仍然有序 */
void insertOrderList(struct sNode* *hl, elemType x)
{
 int i,count = 0;
 struct sNode *newP,*newQ,*swap,*p;
 newP = malloc(sizeof(struct sNode));
 swap = malloc(sizeof(struct sNode));
    if(newP == NULL)
 {
  printf("内存分配失败,退出运行!");
  exit(1);
 }
 if(!emptyList(*hl))
 {
  printf("原线性表为空,请退出重新选择!");
  return ;
 }
    newP->date = x;
 newP->next = *hl;
 *hl = newP;
    newP = *hl;
 newQ = (*hl)->next;
 p = *hl;
 while(p != NULL)
 {
  count++;
  p = p->next;
 }
 while(1)
 {
  for(i = 0; i<=count ;i++)
  {
   if(newQ == NULL)
     {
     newP = *hl;
     newQ = (*hl)->next;
     }

        if(newP->date>newQ->date)
     {
        swap->date = newP->date;
        newP->date= newQ->date;
        newQ->date = swap->date;
     }
    
  newP = newP->next;
  newQ = newQ->next;
    
  }
  if(count == 0)
     {
      break;
     }
  count --;
 }
    return ;
}
/* 13.从单链表中删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 */
elemType deleteFirstList(struct sNode* *hl)
{
 elemType tmpe;
 struct sNode *cp = *hl;
 if(*hl == NULL)
 {
  printf("单链表为空,无表头可进行删除,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 tmpe = cp->date;
    *hl =(*hl)->next;
 free(cp);
 return tmpe;
}
/* 14.从单链表中删除表尾结点并返回它的值,若删除失败则停止程序运行 */
elemType deleteLastList(struct sNode* *hl)
{
 elemType temp;
 struct sNode *cp = *hl;
 struct sNode *ap = NULL;
 while(cp->next != NULL)
 {
  ap = cp;
  cp = cp->next;
 }
 if(ap == NULL)
 {
  *hl = (*hl)->next;
 }
 else
 {
  ap->next = NULL;
 }
 temp = cp ->date;
 free(cp);
 return temp;
}
/* 15.从单链表中删除第pos个结点并返回它的值,若删除失败则停止程序运行 */
elemType deletePosList(struct sNode* *hl, int pos)
{
 int count = 0;
 elemType temp =0;
 struct sNode *cp = *hl,*ap = NULL;
 if(cp == NULL)
 {
  printf("空链表,请退出重新选择!");
  getchar();
  getchar();
  return 0;
 }
 if(pos == 1)
 {
  temp = (*hl)->date;
  *hl = (*hl)->next;
        return temp;
 }
 while(cp != NULL)
 {
  count++;
  if(count == pos)
  {
    break;
  }
  ap = cp;
  cp = cp->next;
 }
 if(pos != 1)
 {
       ap->next = cp->next;
 }
 temp = cp->date;
 free(cp);
 return temp;
}
/* 16.从单链表中删除值为x的第一个结点,若删除成功则返回1,否则返回0 */
int deleteValueList(struct sNode* *hl, elemType x)
{
 struct sNode *cp = *hl;
 struct sNode *ap = NULL;
 while(cp != NULL)
 {
  if(cp->date ==x)
  {
   break;
  }
      ap = cp;
   cp = cp->next;
 }
      if(cp == NULL)
   {
  return 0;
   }
      if(ap == NULL)
  {
       *hl = (*hl)->next;
  }
     else
  {
  ap->next = cp->next;
  }
    free(cp);
    return 1;
}

 
void main()
{
 int i,pos;
 elemType x;
 struct sNode *L;
 while(1){
 printf("1->初始化线性表\n2->清除线性表\n3->返回线性表长度\n4->判定线性表是否为空\n5->返回线性表L中第pos个元素的值\n");
    printf("6->遍历输出线性表L中每个元素\n7->查找线性表L中与x相等元素并返回其位置\n8->把线性表L中第pos个元素的值修改为x的值\n");
 printf("9->向线性表L的表头插入元素x\n10->向线性表L的表尾插入元素x\n11->向线性表L中第pos个元素位置插入元素x\n");
 printf("12->向有序线性表L中插入元素x使得插入后仍然有序\n13->从线性表L中删除表头元素并返回它\n14->从线性表L中删除表尾元素并返回它\n");
 printf("15->从线性表L中删除第pos个元素并返回它\n16->从线性表L中删除值为x的第一个元素\n");
 printf("请选择操作:");
 scanf("%d",&i);
  while(i<1||i>16){
   printf("输入操作不存在,重新输入");
   scanf("%d",&i);
   continue;
  }
      switch(i){
       case 1:
     printf("\n");
     printf("1->初始化线性表");
     initList(&L);
     break;
       case 2:
     printf("\n");
     printf("2->清除线性表");
     clearList(&L);
     break;
       case 3:
     printf("\n");
     printf("3->返回线性表长度");
     printf("线性表长度为%d",sizeList(L));
     getchar();
     getchar();
              break;
       case 4:
              printf("\n");
     printf("4->判定线性表是否为空:");
              if(!emptyList(L)){
      printf("线性表非空!");
     }
     else{
      printf("线性表为空!");
     }
     getchar();
     getchar();
     break;
       case 5:
     printf("\n");
     printf("5->返回线性表L中第pos个元素的值\n");
     printf("请输入查询L线性表pos位置:");
     scanf("%d",&pos);
     printf("\n");
     printf("线性表第%d个值为%d",pos,getElem(L,pos));
     getchar();
     getchar();
     break;
       case 6:
     printf("\n");
     printf("6->遍历输出线性表L中每个元素");
     traverseList(L);
     getchar();
     getchar();
     break;
    case 7:
     printf("\n");
     printf("7->查找线性表L中与x相等元素并返回其位置\n");
     printf("请输入查询x的值:");
     scanf("%d",&x);
     printf("\n");
     printf("与x相等的表中位置为:%d",findList(L,x));
     getchar();
     getchar(); 
     break;
    case 8:
     printf("\n");
     printf("8->把线性表L中第pos个元素的值修改为x的值\n");
     printf("请输入把线性表L位于pos值改为x:\n");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("请输入x:");
     scanf("%d",&x);
     updatePosList(L,pos,x);
     break;
    case 9:
     printf("\n");
     printf("9->向线性表L的表头插入元素x\n");
     printf("请输入在表头插入的x值\n");
     scanf("%d",&x);
     insertFirstList(&L,x);
     getchar();
     getchar();
     break;
    case 10:
     printf("\n");
     printf("10->向线性表L的表尾插入元素x\n");
     printf("请输入在表尾插入的x值:");
     scanf("%d",&x);
     insertLastList(&L,x);
     getchar();
     getchar();
     break;
    case 11:
     printf("\n");
     printf("11->向线性表L中第pos个元素位置插入元素x\n");
     printf("请输入在表L中pos位置插入的x值\n");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("请输入x:");
     scanf("%d",&x);
     insetPosList(&L,pos,x);
     getchar();
     getchar();
     break;
    case 12:
     printf("\n");
     printf("12->向有序线性表L中插入元素x\n");
     printf("请输入x:");
     scanf("%d",&x);
     insertOrderList(&L,x);
     getchar();
     getchar();
     break;
    case 13:
     printf("\n");
     printf("13->从线性表L中删除表头元素并返回它\n");
     printf("被删除的表头元素为:%d",deleteFirstList(&L));
     getchar();
     getchar();
              break;
    case 14:
     printf("\n");
     printf("14->从线性表L中删除表尾元素并返回它");
              printf("被删除的表尾元素为:%d",deleteLastList(&L));
     getchar();
     getchar();
     break;
    case 15:
     printf("\n");
     printf("15->从线性表L中删除第pos个元素并返回它\n");
     printf("请输入在表L中删除的pos位置:");
     printf("请输入pos:");
     scanf("%d",&pos);
     printf("\n");
     printf("被删除的表中第%d个元素为:%d",pos,deletePosList(&L,pos));
     getchar();
     getchar();
     break;
    case 16:
     printf("\n");
     printf("16->从线性表L中删除值为x的第一个元素\n");
     printf("请输入在表L中删除的x值:");
     printf("请输入x:");
     scanf("%d",&x);
     deleteValueList(&L,x);
     getchar();
     getchar();
              break;
   }
   system("cls"); 
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值