当前位置: 代码迷 >> C语言 >> 有关双链表
  详细解决方案

有关双链表

热度:277   发布时间:2006-06-09 11:54:31.0
有关双链表

#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,不能在首位置插入,否则输输出会进入死循环
请问这是为啥?

搜索更多相关的解决方案: 双链  

----------------解决方案--------------------------------------------------------
见了

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

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

----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
  相关解决方案