焚海拦江 发表于 2020-3-4 17:44:40

双向循环列表总是多输出一个T,求各位大佬帮忙看一下是哪里出错了

双向循环列表总是多输出一个T,求各位大佬帮忙看一下是哪里出错了,谢谢各位大佬!
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0

typedef struct{
char value;
}ElementType;


typedef struct Node
{
   Node *prev,*next;
   ElementType data;
}LNode,*LinkList;


typedef short Status;   //状态值,1表示正确,<=0表示各种错误


Status CreateLinkList(LinkList &L)//创建循环双向链表,正确返回1,否则返回错误值,调用后需要根据返回值进行相应操作
{
        LinkList p = NULL,q = NULL;
        int j = 1;
        L = (LinkList)malloc(sizeof(LNode));
        if(L == NULL)
        {
                printf("内存申请失败");
                returnERROR;
        }
        L->prev = L;
        L->next = L;
        return OK;               
}


Status IsEmpty(LinkList &L)//判断传入的是否是空链表(我们对于空链表的定义是只存在头结点的链表)
{
        if(L->prev==L&&L->next==L)
        {
                return OK;
        }
        else
                return ERROR;

}


Status InsertDataAtTail(LinkList &L,ElementType e)//每次从链表最后位置插入元素e
{
        LinkList p=NULL,q=NULL;
                p=L;
                while(1)
                {
                        if(p->next==L)
                                break;
                        p=p->next;
                }
                q=(LinkList)malloc(sizeof(LNode));
                if(q==NULL)
                {
                        printf("插入元素失败!");
                        return ERROR;
                }       
                q->data=e;
                q->prev=p;
                q->next=p->next;
                p->next=q;
                p=q;
                p->next=L;
                L->prev=p;
                returnOK;
}


Status DeleteDataFromList(LinkList &L,char e)//从链表中删除指定的元素
{
        LinkList p=NULL;
        int i=1;
        p=L;
        while(1)
        {
               p = p->next;
               if(p->data.value==e)
               {
                       break;
                }
                if(p->next==L)
                {
                        printf("元素不存在");
                        return ERROR;
                        break;
                }
        }
        p->next->prev=p->prev;
        p->prev->next=p->next;
        return OK;
}

Status SeparateList(LinkList &L)//将数字与英文字符分割为两个双向循环列表
{
        LinkList p=NULL,num=NULL,cha=NULL;
        LinkList L_num=NULL,L_char=NULL;
        CreateLinkList(L_num);
        CreateLinkList(L_char);
        p=L->next;
        while(p!=L)
        {
               
                if(p->data.value>=48&&p->data.value<=57)
                {
                        InsertDataAtTail(L_num,p->data);
                }
                else
                {       
                        InsertDataAtTail(L_char,p->data);
                }
                p=p->next;
        }
        if(IsEmpty(L_num)==1)
        {
                printf("没有数字\n");
        }
        else
        {
                printf("数字双向链表的内容是:\n");
                num=L_num->next;
                while(1)
                {
                       
                        printf("%c",num->data.value);
                       
                        num=num->next;
                        if(num==L_num)
                                break;
                }
                printf("\n");
        }
        if(IsEmpty(L_char)==1)
        {
                printf("没有字符\n");
        }
        else
        {
                printf("字符双向链表的内容是:\n");
                cha=L_char->next;
                while(1)
                {
                       
                        printf("%c",cha->data.value);
                        cha=cha->next;
                        if(cha==L_char)
                                break;
                }
                printf("\n");
        }
        return OK;
}

int main()
{
        LinkList L=NULL;
        int number,i;
        ElementType e;
        if(CreateLinkList(L)==1)//创建双向循环列表
                printf("双向循环链表创建成功!\n");
        printf("输入列表长度,以回车符结束。\n");
        scanf("%d",&number);
        getchar();//删去输入的回车
        printf("请输入单个数字或英文字符:\n");
        for(i=1;i<=number;++i)
        {
                printf("请输入第%d个数据(总数%d):\n",i,number);
                scanf("%c",&e.value);
                getchar();
                InsertDataAtTail(L,e); //尾插法插入输入的元素
        }
        for(i=1;i<=number;++i)
        {
                L=L->next;
                printf("%c",L->data.value);
               
        }printf("\n");
        SeparateList(L);
        return 0;
}

qiuyouzhi 发表于 2020-3-4 17:51:49

我这里没有T啊
你在编译选项里加上-std=c99试试

焚海拦江 发表于 2020-3-4 19:05:04

qiuyouzhi 发表于 2020-3-4 17:51
我这里没有T啊
你在编译选项里加上-std=c99试试

谢谢大佬,我终于发现我错在哪了{:10_266:}是我的主函数的L位置的问题
页: [1]
查看完整版本: 双向循环列表总是多输出一个T,求各位大佬帮忙看一下是哪里出错了