单链表操作

/*
singgleChain.cpp
单链表操作
1.单链表建立2.显示3.排序4.插入5.删除6.修改
by adengou@foxmail.com
2012.07.07
vs2010 和dev++ 5.0编译通过
*/
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
// 节点结构
typedef struct Node
{
 int data;
 struct Node *pNext;
}NODE,*PNODE;

//建立链表
PNODE createList(void);
//显示链表
void traversList(PNODE pHead);
//空链表
bool is_empty(PNODE pHead);
//链表长度
int lengthList(PNODE);
//插入节点
bool insertList(PNODE,int,int);
//删除节点
bool deleteList(PNODE,int,int*);
//修改节点
bool modifyList(PNODE,int,int);
//链表排序
void upsortList(PNODE);
//链表存在判断
bool existList(PNODE);
int main(void)
{
 int insertPos=0;
 int insertVal=0;
 int deletePos=0;
 int deleteVal=0;
 int modifyPos=0;
 int modifyVal=0;
 PNODE pHead=NULL;

 printf("                                   单链表操作                          \n");
 printf("               **********************************************\n");
 printf("               ******            菜单选项                     ******\n");
 printf("               ******                                               ******\n");
 printf("               ******    1.创建链表     2.显示链表   ******\n");
 printf("               ******    3.链表长度     4.链表排序   ******\n");
 printf("               ******    5.插入节点     6.删除节点   ******\n");
 printf("               ******    7.修改节点     0.退出          ******\n");
 printf("               ******                                              ******\n");
 printf("               *************************************** *****\n");
 while(1)
 {
  switch(getchar())
  {
  case '1':
   
   if(existList(pHead))
   {
    printf("链表已存在,你确定建立新链表吗?(Y/N):");
     if(getchar()=='Y' ||getchar()=='y' )
    {
     pHead=createList();
     break;
    }
    if(getchar()=='N' ||getchar()=='n' )
    {
     break;
    }

   }
   else
   {
    pHead=createList();
   }
   
   break;
  case '2':
   if(existList(pHead))
   traversList(pHead);
   break;
  case '3':
   if(existList(pHead))
   printf("链表长度为:%d\n",lengthList(pHead));
   break;
  case '4':
   if(existList(pHead))
   {
   printf("链表升序排序.\n");
   upsortList(pHead);
   traversList(pHead);
    }
   break;
  case '5':
   if(existList(pHead))
   {
   printf("插入节点的位置:");
   scanf("%d",&insertPos);
   printf("插入节点的值:");
   scanf("%d",&insertVal);
   if(!insertList(pHead,insertPos,insertVal))
   {
    printf("节点位置越界,插入不成功!\n");
   }
   }
   break;
  case '6':
   
   if(!existList(pHead))
   {
    break;
   }
   if(is_empty(pHead))
   {
    break;
   }
   printf("删除节点的位置:");
   scanf("%d",&deletePos);
   if(!deleteList( pHead,deletePos,&deleteVal))
   {
    printf("节点位置越界,删除不成功!\n");
   }
   break;
  case '7':
   if(!existList(pHead))
   {
    break;
   }
   if(is_empty(pHead))
   {
    break;
   }
   printf("修改节点的位置:");
   scanf("%d",&modifyPos);
   printf("修改节点的值:");
   scanf("%d",&modifyVal);
   if(!modifyList( pHead, modifyPos, modifyVal))
   {
    printf("节点位置越界,修改不成功!\n");
   }
   break;
  case '0':
   exit(0);
   break;
  default:
   break;
  }
 }


 system("pause");
 return 0;
}

PNODE createList(void)
{
 int len(0);
 int i(0);
 int val(0);
 PNODE pHead=(PNODE)malloc(sizeof(NODE));
 if(pHead==NULL)
 {
  printf("内存分配失败!");
  exit(-1);
 }
 PNODE pTail=pHead;
 pTail->pNext=NULL;

 printf("请输入节点个数len=");
 scanf("%d",&len);
 
 while(i<len)
 {
  printf("请输入第个%d节点的值(以空格隔开):",i+1);
  scanf("%d",&val);
  PNODE pTmp=(PNODE)malloc(sizeof(NODE));
     if(pTmp==NULL)
     {
     printf("内存分配失败!");
     exit(-1);
     }
  pTmp->data =val;
  pTail->pNext =pTmp;
  pTmp->pNext=NULL;
  pTail=pTmp;
  i++;

 }
 printf("链表创建完成!\n");
 return pHead;
}

void traversList(PNODE pHead)
{
 int i=0;
 if(is_empty(pHead))return;
 PNODE pHe=pHead->pNext ;
 while(pHe!=NULL)
 {
  printf("第%d个节点的值是:%d\n",i+1,pHe->data );
  pHe=pHe->pNext ;
  i++;
 }
 return;
}

bool is_empty(PNODE pHead)
{
 if(pHead->pNext==NULL)
 {
  printf("链表为空!\n");
  return true;
    }
 else
 {
  return false;
 }
}

int lengthList(PNODE pHead)
{
 int len=0;
 if(!is_empty(pHead))
 {
    PNODE pHe=pHead->pNext;
    while(pHe!=NULL)
    {
     pHe=pHe->pNext;
     len++;
   
    }
 }
 return len;
}
void upsortList(PNODE pHead)
{
 int tempVal=0;
 int i=0;
 int j=0;
 PNODE pHe=NULL;
 PNODE pHe2=NULL;
 if(!is_empty(pHead))
 {
       for(i=0,pHe=pHead->pNext;i<lengthList(pHead)-1;i++,pHe=pHe->pNext)
    {
     for(j=i+1,pHe2=pHe->pNext;j<lengthList(pHead);j++,pHe2=pHe2->pNext)
     {
      if(pHe->data>pHe2->data)
      {
       tempVal=pHe->data;
       pHe->data=pHe2->data;
       pHe2->data=tempVal;
      }
     }
    }
 }
 
 return;
}

//在pHead指向的单链表的第pos个节点的前面插入一个新的结点,
//该节点的值为VAL;
bool insertList(PNODE pHead,int pos,int val)
{
   int i=0;
   PNODE pHe=pHead;
   while (pHe!=NULL&& i<pos-1)
   {
    pHe=pHe->pNext ;
    ++i;
   }
  if(i>pos-1||pHe==NULL)
  {
   return false;
  }
  PNODE pNew=(PNODE)malloc(sizeof(NODE));
  if(pNew==NULL)
  {
   printf("分配内存失败!");
   exit(-1);
  }
  pNew->data=val;
  PNODE pTmp=pHe->pNext;
  pHe->pNext=pNew;
  pNew->pNext=pTmp;

  return true;
}

bool existList( PNODE pHead)
{
 if(pHead==NULL)
 {
  printf("未创建链表!\n");
   return false;
 }
 else
 {
  return true;
 }
}

bool deleteList(PNODE pHead,int pos,int *val)
{
 int i=0;

 if(pos<1||pos>lengthList(pHead))
 {
  return false;
 }
 
 PNODE pHe=pHead;
 while (pHe->pNext!=NULL&& i<pos-1)
 {
  pHe=pHe->pNext;
  ++i;
 }
 if(i>pos-1||pHe->pNext==NULL)
 {
  return false;
 }
 PNODE pTmp=pHe->pNext ;
 *val=pTmp->data ;
 pHe->pNext=pHe->pNext->pNext ;
 free(pTmp);
 pTmp=NULL;
     printf("删除的是第%d个节点,值为:%d\n",pos,*val);
 return true;
}
bool modifyList(PNODE pHead,int modifyPos,int modifyVal)
{
 int i=0;

 if(modifyPos<1||modifyPos>lengthList(pHead))
 {
  return false;
 }
 
 PNODE pHe=pHead;
 while (pHe!=NULL&& i<modifyPos-1)
 {
  pHe=pHe->pNext;
  ++i;
 }
 if(i>modifyPos-1||pHe==NULL)
 {
  return false;
 }
 pHe->pNext->data=modifyVal;
 printf("修改成功!\n");
 return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值