鱼C论坛

 找回密码
 立即注册
查看: 2014|回复: 3

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

[复制链接]
发表于 2020-3-4 17:44:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
双向循环列表总是多输出一个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("内存申请失败");
                return  ERROR;
        } 
        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;
                return  OK; 
}


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;
}
批注 2020-03-04 174335.jpg
最佳答案
2020-3-4 17:51:49
我这里没有T啊
你在编译选项里加上-std=c99试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 17:51:49 | 显示全部楼层    本楼为最佳答案   
我这里没有T啊
你在编译选项里加上-std=c99试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-4 19:05:04 | 显示全部楼层
qiuyouzhi 发表于 2020-3-4 17:51
我这里没有T啊
你在编译选项里加上-std=c99试试

谢谢大佬,我终于发现我错在哪了是我的主函数的L位置的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-7 16:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表