怎样使输出的数是闭区间的数

怎样输出的数是闭区间的数

img

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;  
typedef struct LNode
{
    ElemType data;
    struct LNode * next;
}LNode,*pLinkList;
typedef LNode * PNode;

//创建带有头结点的空链表
pLinkList SetNullList_Link()
{
    pLinkList head = (pLinkList)malloc(sizeof(LNode)); //申请头结点空间
    if (head != NULL)
        head->next = NULL;
    else
        printf("申请头节点空间失败!\n");
    return head; //返回头指针
}

int IsNull_Link(pLinkList head) //判断链表是否为空,空返回1,非空返回0
{
    return(head->next == NULL);
} 
//2)存放一组有序数,或产生一组随机数建立单链表并对单链表排序。
void CreatSortList(LNode*& L, int length)
{
    L = (LNode*)malloc(sizeof(LNode));
    LNode* p, * pre, * s;
    s = L;
    for (int i = 0; i < 2; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = rand() % 100 + 1;;
        s->next = p;
        s = p;
    }
    L->next->next = NULL;
    for (int i = 1; i < length; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = rand() % 100 + 1;;
        pre = L;
        while (pre->next != NULL && pre->next->data < p->data){
            pre = pre->next;
        }
        p->next = pre->next;
        pre->next = p;
    }
}

//4)有序单链表L中取出第i个元素。
int GetElem(LNode *L,int i)
{
    int j=0;
    LNode *p=L;
    if(i<=0) return false;
    while(j<i && p!=NULL){
        j++;
        p=p->next;
    }
    if(p==NULL)
        return false;
    else{
        return(p->data);
    }
}

//9)将有序单链表L中属于区间[low,high]的数据取出存入新的有序单链表L1。
bool IntervalList(LNode *&L,ElemType low,ElemType high,LNode *&L1)
{ElemType lowElem=GetElem(L,low);
    ElemType highElem=GetElem(L,high);
    LNode *p,*q;
    p=L->next;
    q=p->next;
    while(p->data<lowElem)
    {
    p=q;
    q=q->next;
    }
    L1->next=q;
    LNode *r,*s;
    r=L->next;
    s=r->next;
    while(s->data<highElem)
    {
    r=s;
    s=s->next;
    }
    r->next=NULL;
    p->next=s;
} 

void printList(pLinkList list)
{
    PNode  temp = list->next;
    int i = 0;
    while (temp)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

int main()
{
    int Index;
    pLinkList L= NULL;
    L = SetNullList_Link();
    pLinkList L1= NULL;
    L1= SetNullList_Link();
    ElemType low,high;
    CreatSortList(L,10);
    printf("随机生成数据:"); 
    printList(L);
    printf("请输入你想存入新的链表的数据的左区间:");
    scanf("%d",&low);
    printf("请输入你想存入新的链表的数据的右区间:"); 
    scanf("%d",&high);
    IntervalList(L,low,high,L1);
    printList(L1);
}

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef int ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode* next;
}LNode, * pLinkList;
typedef LNode* PNode;

//创建带有头结点的空链表
pLinkList SetNullList_Link()
{
    pLinkList head = (pLinkList)malloc(sizeof(LNode)); //申请头结点空间
    if (head != NULL)
        head->next = NULL;
    else
        printf("申请头节点空间失败!\n");
    return head; //返回头指针
}

int IsNull_Link(pLinkList head) //判断链表是否为空,空返回1,非空返回0
{
    return(head->next == NULL);
}
//2)存放一组有序数,或产生一组随机数建立单链表并对单链表排序。
void CreatSortList(LNode*& L, int length)
{
#if 0    
    L = (LNode*)malloc(sizeof(LNode));
    s = L;
    for (int i = 0; i < 2; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = rand() % 100 + 1;
        s->next = p;
        s = p;
    }
    L->next->next = NULL;
#endif
    LNode* p, * pre, * s;
    for (int i = 1; i <= length; i++)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = rand() % 100 + 1;
        p->next = NULL;       //修改
        if (!L->next) {       //第一个结点,直接链入链表 L
            L->next = p;
        }
        else {               //第二个结点开始,排序后链入链表 L
            pre = L;
            while (pre->next != NULL && pre->next->data < p->data) {
                pre = pre->next;
            }
            p->next = pre->next;
            pre->next = p;
        }
    }
}

//4)有序单链表L中取出第i个元素。
int GetElem(LNode* L, int i)
{
    int j = 0;
    LNode* p = L;
    if (i <= 0) return false;
    while (j < i && p != NULL) {
        j++;
        p = p->next;
    }
    if (p == NULL)
        return false;
    else {
        return(p->data);
    }
}

//9)将有序单链表L中属于区间[low,high]的数据取出存入新的有序单链表L1。
bool IntervalList(LNode*& L, ElemType low, ElemType high, LNode*& L1)
{
#if 0
    ElemType lowElem = GetElem(L, low);
    ElemType highElem = GetElem(L, high);
    L1->next = q;
    LNode* r, * s;
    r = L->next;
    s = r->next;
    r->next = NULL;
    p->next = s;
#endif
    if (low > high)
        high += low, low = high - low, high = high - low;
    LNode* pL = L->next, * pt = L, * tail = NULL;
    while (pL && pL->data < low)
    {
        pt = pL;
        pL = pL->next;
    }
    while (pL && pL->data <= high)
    {
        tail = pL;
        pL = pL->next;
    }
    if (tail) {  //[low,high]区间在 L 链表数据区间内
        L1->next = pt->next;
        pt->next = tail->next;
        tail->next = NULL;
    }
    return 1;
}

void printList(pLinkList list)
{
    PNode  temp = list->next;
    int i = 0;
    if (!temp) {   //修改
        printf("NULL");
    }
    else {
        while (temp)
        {
            printf("%d ", temp->data);
            temp = temp->next;
        }
    }
    printf("\n");
}

int main()
{
    int Index;
    srand((unsigned int)time(NULL));  //修改
    pLinkList L = NULL;
    L = SetNullList_Link();
    pLinkList L1 = NULL;
    L1 = SetNullList_Link();
    ElemType low, high;
    CreatSortList(L, 10);
    printf("随机生成数据:");
    printList(L);
    printf("请输入你想存入新的链表的数据区间的左值:");
    scanf("%d", &low);
    printf("请输入你想存入新的链表的数据区间的右值:");
    scanf("%d", &high);
    IntervalList(L, low, high, L1);
    printList(L1);
    printList(L);
    return 0;
}

你这所谓的“闭区间”应该是指索引范围吧?可是你代码里写的逻辑是:输出范围在开区间(low位置的值,high位置的值)之间的数据