> 信息中心

希望大神用C语言写 不带头结点的循环双链表的实现和相关操作?谢谢大神

来源:百度知道 编辑:王阿强
有网友碰到过这样的希望大神用C语言写 不带头结点的循环双链表的实现和相关操作?谢谢大神,问题详细内容为:希望能添加备注...希望能添加备注展开,我搜你通过互联网收集了相关的一些解决方案,希望对有过相同或者相似问题的网友提供帮助,具体如下:

网友提供的解决方案1:

(由于你提问题没选择代码模板,贴代码格式都没了,为了方便你阅读,我把原文件上传网盘了,链接: 文件 提取码: wkuq )

你要求不用头节点,那就用指针。但本身没什么区别,就是定位链表位置的,否则你找不到链表。

程序代码我写了以下功能:

遍历双向循环链表,及增删改查4个功能。

作为演示,结构成员我就定义了两个,你想自定义成员,把对应函数部分添加代码就可。
所有函数,都独立调试过了,可以把我的程序拆开来用。

注意:传递给函数add2list的链表指针,必须有初值NULL(从编程角度,你定义指针也得给初值NULL,,否则是野指针,随机地址) 。

另外说明:头文件conio.h对应函数getch,在代码中只是起一个暂停作用,否则刷新你看不到错误提示。这个库在windows系统下可用,linux不一定可用,删除这个库和函数也不影响执行。

#include<stdio.h>

#include<conio.h>

#include<malloc.h>

typedef struct list//链表节点,成员自己添加

{

int id;

int value;//数值

struct list *last;//指向前一个节点

struct list *next;//指向后一个节点

}LIST;

void showList(LIST **lp0);//循环打印双向链表

LIST *add2List(LIST **lp0);//新增节点到链表当前指针位置的前面,成功创建返回新节点,失败返回NULL,新增节点在当前指针位置的前面

LIST *selectByID(LIST *lp0);//通过成员变量id查找节点,返回找到的节点地址,未找到返回NULL,你若想通过自定义的成员变量查找,模仿这个代码!!

int delList(LIST *lp0,LIST *list);//删除节点,成功返回1,失败返回0(如果删除了最后一个,指针会自动指向NULL)

int update(LIST *lp0,LIST *list);//修改对应节点成员变量信息,你若想修改自定义的成员变量,模仿这个代码!!

int main()

{

LIST *lp0=NULL;

showList(&lp0);

return 0;

}

void showList(LIST **lp0)//循环打印双向链表

{

static int cnt=0;

char mesg[100]={0};

LIST *lpSave=NULL;

int n,flag,idSave;

while(1)

{

n=0,flag=0,idSave=-1;

system("cls");

printf("双向循环链表当前共有%d个节点\n",cnt);

if(*lp0)

{

idSave=(*lp0)->id;

printf("当前指针指向编号%d的节点,值:%d\n",idSave,(*lp0)->value);

printf("(1.下一个 2.上一个 3.增加 4.删除 5、修改 6、查找 7.退出)\n");

while(n<1 || n>6) scanf("%d",&n);

}

else

{

printf("(1.(不可用) 2.(不可用) 3.增加 4.(不可用) 5、(不可用) 6.退出)\n");

while(n!=3 && n!=6) scanf("%d",&n);

}

switch(n)

{

case 1:*lp0=(*lp0)->next;break;

case 2:*lp0=(*lp0)->last;break;

case 3:

lpSave=add2List(lp0);

if(lpSave)

{

if(idSave!=-1)

sprintf(mesg,",已在当前位置(编号%d)前面添加了一个新节点!",idSave);

printf("节点添加成功!%s\n指针重新定位到新节点!......按任意键继续......\n",mesg);

*lp0=lpSave;

cnt++;

getch();

}

else

printf("信息输入错误,或异常!节点添加失败!......按任意键继续......\n"),getch();

break;

case 4:

lpSave=(*lp0)->next;

if(delList(*lp0,*lp0))

{

if(lp0)

*lp0=lpSave,lpSave=NULL,cnt--;

printf("删除成功!指针已重新定位到下一个节点!......按任意键继续......\n"),getch();

}

else

printf("删除失败!异常终止!......按任意键继续......\n"),getch();

break;

case 5:

if(update(*lp0,*lp0))

printf("修改成功!......按任意键继续......\n"),getch();

else

printf("修改失败!异常终止!......按任意键继续......\n"),getch();

break;

case 6:

if((lpSave=selectByID(*lp0)))

*lp0=lpSave,printf("已找到该节点!......按任意定位到该节点......\n"),getch();

else

lpSave=NULL,printf("......按任意键继续......\n"),getch();

break;

case 7:flag=1;break;

}

if(flag)

break;

}

}

LIST *add2List(LIST **lp0)//新增节点到链表当前指针前面的位置,成功创建返回1,失败返回0

{

static int id=0;

LIST *ln=NULL;

ln=(LIST *)malloc(sizeof(LIST));

if(!ln)//抛出异常

return NULL;

//-----------这里给新建的节点的成员变量赋值----------------

ln->id=++id;//我这里演示,只定义成员变量id和value,id自增使用静态变量,其余成员变量你自己添加

printf("请输入节点值:");

scanf("%d",&ln->value);

//----------------------------------------------------------

ln->last=ln;

ln->next=ln;

if(*lp0)//非第一次,在当前指针前面位置创建

{

(*lp0)->last->next=ln;

ln->next=*lp0;

ln->last=(*lp0)->last;

(*lp0)->last=ln;

}

else

*lp0=ln;

return ln;

}

int update(LIST *lp0,LIST *list)//成功返回1,失败返回0

{

LIST *lpSave=lp0;

while(lp0)

{

if(lp0==list)

{

printf("请更新该节点(编号%d)的值:",lp0->id);

scanf("%d",&(lp0->value));

return 1;

}

lp0=lp0->next;

if(lp0==lpSave)//循环一周未找到匹配!

{

printf("没有找到对应的节点,删除失败!\n");

return 0;

}

}

return 0;

}

int delList(LIST *lp0,LIST *list)//删除节点,成功返回1,失败返回0(如果删除了最后一个,指针会自动指向NULL)

{

LIST *lpSave=lp0;

int flag=0;

if(lp0==NULL || list==NULL)

return 0;

while(lp0)

{

if(lp0==list)

{

if(lp0==lp0->next)//判断要删除的节点是否为最后一个

flag=1;

lp0->last->next=lp0->next;

lp0->next->last=lp0->last;

free(lp0);

if(flag)

lp0=NULL;//删除了最后一个节点,指针置NULL

break;

}

lp0=lp0->next;

if(lp0==lpSave)//循环一周未找到匹配!

{

printf("没有找到对应的节点,删除失败!\n");

return 0;

}

}

return 1;

}

LIST *selectByID(LIST *lp0)//通过成员变量id查找节点,返回找到的节点地址,未找到返回NULL,你若想通过自定义的成员变量查找,模仿这个代码!!

{

int id;

LIST *lpSave=lp0;

if(!lp0)

return NULL;

printf("请输入要查找的节点ID:");

scanf("%d",&id);

while(lp0)

{

if(lp0->id==id)

return lp0;

lp0=lp0->next;

if(lp0==lpSave)

{

printf("没有找到对应的节点!\n");

break;

}

}

return NULL;

}

更多追问追答 追问 那个网盘没有链接呢 追答 被百度删了?
链接: http://pan.baidu.com/s/1hjhs-05PRUnu0vnhstryjg 提取码: qih6 追问 谢谢

在长度为n的循环单链表中查找值最大的结点,其时间...

答:就是 o(n) 需要遍历一遍


请注意,本站信息均由系统收集自互联网,相关信息仅供参考,医疗等重要信息请以正规途径为最终意见,本站不承担任何责任!

www.wosoni.com false 互联网 http://www.wosoni.com/b/muuptr/ckkfjhgccjjiijidldi.html report 7223 网友提供的解决方案1:(由于你提问题没选择代码模板,贴代码格式都没了,为了方便你阅读,我把原文件上传网盘了,链接: 文件 提取码: wkuq )你要求不用头节点,那就用指针。但本身没什么区别,就是定位链表位置的,否则你找不到链表。程序代码我写了以下功能:遍历双向循环链表,及增删改查4个功能。作为演示,结构成员我就定义了两个,你想自定义成员,把对应函数部分添加代码就可。所有函数,都独立调试过了,可以把我的程序拆开来用。注意:传递给函数add2list的链表指针,必须有初值NULL(从编程

热门图片

经济金融企业管理法律法规社会民生科学教育降生活体育运动文化艺术电子数码电脑网络娱乐休闲行政地区心理分析医疗卫生