刚踏入数据结构的大门,求大神指导为什么我的插入输出时出现问题
#include<stdio.h>#include<stdlib.h>
typedef char datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
linklist *head;
linklist *creatlistf()//***************************************创建链表ok
{
datatype ch;//逐个输入字符,以“回车”为结束符,返回单链表头指针
linklist *head,*s,*r;
head=(linklist*)malloc(sizeof(linklist));
r=head;
printf("输入链表各结点的数据:\n");
while((ch=getchar())!='\n')
{
s=(linklist*)malloc(sizeof(linklist));//生成新结点
s->data=ch;//将输入数据放入新节点的数据域中
r->next=s;
r=s;//将新结点插入到表头上
}
r->next=NULL;
return head;//返回链表头指针
}
//**************************************************************************打印链表ok
void trave(linklist *l)
{
linklist *p=l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\n");
}
//**************************************************************************计算链表长度
void LENGTH(linklist *l)
{
linklist *p;
p=l->next;
int j=0;
while(p!=NULL)
{
j++;
p=p->next;
}
printf("链表长度为:%d",j);
}
void GET(linklist *l,int i)//********************************按位置查找
{
linklist *p;
int j=0;
p=l;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
printf("能找到的值为%c:",p->data);
else
printf("不能找到该位置上的值");
}
void INSERT(linklist *l,datatype x,int i)//********************插入****************ok
{
linklist *p,*s;
p=l;
int j;
for(j=0;j<=i-1;j++)
{
p=p->next;
}
if(p==NULL)
{
printf("error,can not find");
exit(0);
}
s=(linklist*)malloc(sizeof(linklist));
s->data=x;
s->next=p->next;
p->next=s;
}
void DELETER(linklist *l,int i)/**********************删除****************/
{
linklist *p=l,*r;
int j;
for(j=0;j<i-1;j++)
{
p=p->next;
}
if(p==NULL||p->next==NULL)
{
printf("can not find");
exit(0);
}
r=p->next;
p->next=r->next;
free(r);
}
void PURGE(linklist *l)/**********************************消除表中多余结点********************************/
{
linklist *p=l->next,*t;
linklist *q=NULL;
while(p!=NULL)
{
q=p;
while(q->next!=NULL)
{
if(q->next->data!=p->data)
q=q->next;
else
{
t=q->next;
q->next=q->next->next;
free(t);
}
}
p=p->next;
}
}
linklist *change(linklist *l)//************************************************逆置单链表
{
linklist *p=l->next,*s;
l->next=NULL;
while(p)
{
s=p;
p=p->next;
s->next=l->next;
l->next=s;
}
return l;
}
void main()
{
linklist *l,*n;
int i;
datatype x;
l=creatlistf();
/*************显示菜单**********/
/***********用户选择并转入相应函数*********/
printf("\n*===============================================================*\n");
printf("\n*-------------------欢迎使用单链表管理系统----------------------*\n");
printf("\n* ★1.单链表的打印 *\n");
printf("\n* ★2.查找运算 *\n");
printf("\n* ★3.插入运算 *\n");
printf("\n* ★4.删除运算 *\n");
printf("\n* ★5.清除多余重复结点 ☆By: *\n");
printf("\n* ★6.测试链表长度 ☆******* *\n");
printf("\n* ★7.逆置带头结点的单链表 *\n");
printf("\n* ★0.退出管理模式 ☆201321012838 *\n");
printf("\n*===============================================================*\n");
do
{
printf("\n -------请选择服务种类------- \n");
scanf("%d",&i);
switch(i)
{
case 1: trave(l);break;
case 2:
printf("输入要查找的数据的位置:\n");
scanf("%d",&i);
GET(l,i);
break;
case 3:
printf("输入要插入的数据和位置:\n");
scanf("%c%d",&x,&i);
INSERT(l,x,i);
printf("插入后的链表数据:\n");
trave(l);
break;
case 4:
printf("输入要删除结点的位置:\n");
scanf("%d",&i);
DELETER(l,i);
printf("删除后的链表数据:\n");
trave(l);
break;
case 5:
printf("清楚表中多余重复结点:\n");
PURGE(l);
trave(l);
break;
case 6: LENGTH(l);break;
case 7:
n=change(l);
printf("遍历逆置后的链表:\n");
trave(n);
break;
case 0: exit(0);
default : break;
}
}while(1);
}
页:
[1]