/*
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;
}