怎样输出的数是闭区间的数
#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位置的值)之间的数据