榆木mandy 发表于 2014-10-15 18:43:51

刚踏入数据结构的大门,求大神指导为什么我的插入输出时出现问题

#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);
}


大个的糖果 发表于 2014-10-30 18:15:25

页: [1]
查看完整版本: 刚踏入数据结构的大门,求大神指导为什么我的插入输出时出现问题