数据结构论坛

注册

 

发新话题 回复该主题

关于郝斌的C语言改写C程序 [复制链接]

1#

数据结构学习笔记

关于链表的程序改写(C语言----C++)

1、郝斌的C语言代码

#includestdio.h

#includemalloc.h

#includestdlib.h

typedefstructNode

{

intdata;//数据域

structNode*pNext;//指针域

}NODE,*PNODE;//NODE等价于structNode,PNODE等价于structNode*

//函数声明

PNODEcreate_list(void);

voidtraverse_list(PNODEpHead);

boolis_empty(PNODEpHead);

intlength_list(PNODE);

boolinsert_list(PNODE,int,int);

booldelete_list(PNODE,int,int*);

voidsort_list(PNODE);

intmain(void)

PNODEpHead=NULL;//等价于structNode*pHead=NULL;

intval;

pHead=create_list();//creat_list()功能:创建一个非循环单链表,并将该链表的头节点的地

址付给pHead

traverse_list(pHead);

intlen=length_list(pHead);

printf("链表长度是%d\n",len);

if(is_empty(pHead))

printf("链表为空!\n");

else

printf("链表不空!\n");

sort_list(pHead);

insert_list(pHead,4,33);

if(delete_list(pHead,4,val))

printf("删除成功,您删除的元素是:%d\n",val);

}

printf("删除失败!您删除的元素不存在!\n");

return0;

PNODEcreate_list(void)

intlen;//用来存放有效节点的个数

inti;

intval;//用来临时存放用户输入的节点的值

//分配了一个不存放有效数据的头节点

PNODEpHead=(PNODE)malloc(sizeof(NODE));

if(NULL==pHead)

printf("分配失败,程序终止!\n");

exit(-1);

PNODEpTail=pHead;//尾节点指向头节点,因为创造了0个节点,那么头节点就是尾节点

pTail-pNext=NULL;//0个节点那么没有下一个节点,则节点指针域指向NULL

printf("请输入您需要生成的链表节点的个数:len=");

scanf("%d",len);

for(i=0;ilen;i++)//for每循环一次就创造新的节点

printf("请输入第%d个节点的值:",i+1);

scanf("%d",val);

PNODEpNew=(PNODE)malloc(sizeof(NODE));//创造新的节点

if(NULL==pNew)

pNew-data=val;//挂,//新节点中数据域中的值

pTail-pNext=pNew;//尾节点的指针域保存新节点的指针(地址)

pNew-pNext=NULL;//新节点的指针域指向NULL

pTail=pNew;//新节点添加在旧链表的末尾,变成尾节点。

returnpHead;

voidtraverse_list(PNODEpHead)

PNODEp=pHead-pNext;//头节点的指针域,指向第一个节点的指针(地址)

while(NULL!=p)//最后一个节点指针域为NULL

printf("%d",p-data);//节点数据域中的数据

p=p-pNext;//下一个节点的指针域。不连续,不能用p++

printf("\n");

return;

boolis_empty(PNODEpHead)

if(pHead-pNext==NULL)//头节点指针域为NULL则链表为空

returntrue;

returnfalse;

intlength_list(PNODEpHead)//和遍历链表算法一样,只是在遍历链表时用一个变量++就行

intlen=0;

len++;//节点数自增

returnlen;//节点数

voidsort_list(PNODEpHead)//选择排序

//for(i=0;ilen-1;++i)//两两比较只需要比较len-1次

//{

//for(j=i+1;jlen;++j)//从第i+1个开始进行比较

//if(aa[j])//两数互换,大右小左,两杯水互换,引入第三个杯子temp

//temp=a;

//a=a[j];

//a[j]=temp;

//}

inti,j,t;

PNODEp,q;

for(i=0,p=pHead-pNext;ilen-1;++i,p=p-pNext)//两两比较只需要比较len-1次

for(j=i+1,q=p-pNext;jlen;++j,q=q-pNext)//从第i+1个开始进行比较

if(p-dataq-data)//类似于数组中的:aa[j]

t=p-data;//类似于数组中的:t=a;

p-data=q-data;//类似于数组中的:a=a[j];

q-data=t;//类似于数组中的:a[j]=t;

//在pHead所指向链表的第pos个节点的前面插入一个新的节点,新节点的值是val,并且

pos的值是从1开始

//看20_非循环单链表插入节点伪算法讲解部分

boolinsert_list(PNODEpHead,intpos,intval)

inti=0;

PNODEp=pHead;//指向头节点的指针(地址)

while(NULL!=pipos-1)//在遍历链表时用一个变量++然后和要插入pos位置进行比较

++i;//节点数自增

if(ipos-1

NULL==p)//插入位置大于原链表的长度或插入到NULL空链表

printf("动态分配内存失败!\n");

pNew-data=val;//节点数据域中的数据插入

//问题:已知p节点,把新节点q插入到p节点后面?两种插入算法

PNODEq=p-pNext;

p-pNext=pNew;

pNew-pNext=q;

//看21_非循环单链表删除节点伪算法的讲解部分

booldelete_list(PNODEpHead,intpos,int*pVal)

PNODEp=pHead;

while(NULL!=p-pNextipos-1)

p=p-pNext;

++i;

if(ipos-1

NULL==p-pNext)

*pVal=q-data;

//删除p节点后面的节点

p-pNext=p-pNext-pNext;

free(q);

q=NULL;

2、改写的C++代码块

#includeiostream

usingnamespacestd;

typedefclassNode

public/p>

  intdata;

  Node*pNext;

}NODE,*PNODE;

//创建链表

PNODEcreate_list()

  intlen;  //存放有效节点个数

  intval;  //临时存放用户输入的节点的值

  PNODEpHead=newNODE;

  if(pHead==NULL)

  {

    cout"分配失败,程序终止!"endl;

    exit(-1);

  }

  PNODEpTail=pHead;

  pTail-pNext=NULL;

  cout"请输入您要生成的链表节点的个数:"endl;

  cinlen;

  for(inti=0;ilen;i++)

  {

    cout"请输入第"i+1"个节点的值:"endl;

    cinval;

    PNODEpNew=newNODE;

    if(pNew==NULL)

    {

      cout"分配事变,程序终止!"endl;

      exit(-1);

    }

    //链接新节点

    pTail-pNext=pNew;

    pNew-data=val;

    pNew-pNext=NULL;

    //将新节点置为尾结点

    pTail=pNew;

  }

//遍历链表

  //头节点的指针域,指向首节点

  PNODEp=pHead-pNext;

  while(p!=NULL)

  {

    coutp-data"";

  }

  coutendl;

//判断链表是否为空

boolis_Empty(PNODEpHead)

  if(pHead-pNext==NULL)

//计算链表长度

intlength_list(PNODEpHead)

  intlength=0;

  while(p-pNext!=NULL)

  {

    length++;

  }

  returnlength;

//插入节点

  inti=0;

  while(p-pNext!=NULLipos-1)

  {

    i++;

  }

  if(p-pNext==NULLipos-1)

  {

    cout"动态分配内存失败!"endl;

  }

  pNew-pNext=p-pNext;

//删除节点

  inti=0;

  {

    i++;

  }

  deleteq;

//冒泡排序

voidsort_list(PNODEpHead)

  for(inti=0;ilen-1;i++)

  {

    for(intj=i+1;jlen;j++)

    {

      if(p-dataq-data)

      {

        inttemp=p-data;

        p-data=q-data;

        q-data=temp;

      }

      q=q-pNext;

    }

  }

intmain()

  intval;

  intlen=0;

  PNODEpHead=NULL;

  //创建链表

  pHead=create_list();

  //遍历链表

  //判断链表是否为空

  if(is_Empty(pHead))

    cout"链表为空"endl;

  else

    cout"链表不为空"endl;

  //计算链表长度

  len=length_list(pHead);

  cout"链表长度:"lenendl;

  //插入节点

  if(insert_list(pHead,3,3))

  {

    cout"插入成功"endl;

  }

  else

    cout"插入失败"endl;

  //删除节点

  if(delete_list(pHead,3,val))

  {

    cout"删除成功"endl;

    cout"val="valendl;

  }

  else

    cout"删除失败"endl;

  //冒泡排序

  system("pause");

  return0;

————————————————

版权声明:本文为CSDN博主「奇幻纬度」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

分享 转发
TOP
发新话题 回复该主题