| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 517 人关注过本帖
标题:有关双链表
只看楼主 加入收藏
yesxdf
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-1
收藏
 问题点数:0 回复次数:2 
有关双链表

#include<stdio.h>
#include<stdlib.h>

struct Node
{
char date;
struct Node *next;
struct Node *front;
};

struct Node *creat()
{
struct Node *head,*tail,*p;
char x;
head=tail=NULL;
x=NULL;
printf("请输入该线性链表的数据,以回车结束输入:\n");
fflush(stdin);
x=getchar();
while(x!='\n') /*输入一个字母或符号结束输入*/
{
p= (struct Node *) malloc (sizeof(struct Node));
p->date=x;
p->next=NULL;
p->front=NULL;
if(head==NULL)
{
head=p;
head->next=head;
head->front=head;
tail=head;
}
else
{
tail->next=p;
p->front=tail;
tail=tail->next;
tail->next=head;
head->front=tail;
}
x=getchar();
}
return(head);
}

void del(struct Node *head,struct Node *tail,int x)
{
struct Node *p,*q;
int i;
p=head;

if(x==1)
{
head=head->next;
head->front=tail;
tail->next=head;
free(p);
}
else
{
for(i=1;i<x;i++)
{
q=p;
p=p->next;
}
if(p->next==head)
{
q->next=head;
head->front=q;
free(p);
}
else
{
q->next=p->next;
(p->next)->front=q;
free(p);
}
}
}

void insert(struct Node *head,struct Node *tail,char m,int n)
{
struct Node *p,*q,*r;
int x,i;
r=(struct Node *) malloc(sizeof(struct Node));
r->date=m;
r->next=r->front=NULL;
p=head;
q=tail;
x=n;
fflush(stdin);
if(x==1)
{
r->front=head;
(head->next)->front=r;
r->next=head->next;
head->next=r;
}
else
{
for(i=1;i<x;i++)
{
p=p->next;
}
if(p->next==head)
{
p->next=r;
r->front=p;
r->next=head;
}
else
{
r->front=p;
r->next=p->next;
(p->next)->front=r;
p->next=r;
}
}
}

main()
{
struct Node *head,*tail,*p,*r,*s;
int i,y;
char c,x;

while(1)
{
fflush(stdin);
printf("\n请输入你要执行的操作(首先请创建一个线性链表):\n1:创建链表\n2:删除元素\n3:插入元素\n4:输出\n5:退出\nchoose:");
scanf("%c",&c);
switch(c)
{
case '1':
{
head=creat();
tail=head->front;
break;
}
case '2':
{
p=r=head;
fflush(stdin);
printf("请输入你要删除的数的位置:");
scanf("%d",&y);
del(r,tail,y);
break;
}
case'3':
{
p=head;
printf("请输入你要插入的数据与该数据的位置:");
scanf("%c %d",&x,&y);
fflush(stdin);
insert(p,tail,x,y);
break;
}

case '4':
{
p=head;
while(p)
{
printf("%c",p->date);
p=p->next;
if(p==tail)
{
printf("%c\n",p->date);
break;
}
}
break;
}

case '5':
{
printf("Thank you");
exit(1);
}
}
}
}


各位,该程序原来在处理整数时没什么问题,后来改成处理字符就出了不少问题:1,在删除后输出不是期望的结果,且不能删除两次.2,不能在首位置插入,否则输输出会进入死循环
请问这是为啥?

搜索更多相关主题的帖子: 双链 
2006-06-09 11:54
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
见了

双向链表+冗长代码=打怵

——摘自崔永元<实话实说>

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-09 12:01
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

嘿嘿,双链表在C++的STL占很重要的地位,而且某种情况下很高效率的.不要看楼主的程序长,STL的list更加长,连动态分配内存的函数都重新写过。


c++/C + 汇编 = 天下无敌
2006-06-09 13:19
快速回复:有关双链表
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025217 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved