6-1 循環單鏈表區間刪除(15 分)
本題要求實現帶頭結點的循環單鏈表的創建和單鏈表的區間刪除。L是一個帶頭結點的循環單鏈表,函數ListCreate_CL用於創建一個循環單鏈表,函數ListDelete_CL用於刪除取值大於min小於max的鏈表元素。
函數接口定義:
Status ListCreate_CL(LinkList &CL);
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max);
裁判測試程序樣例:
//庫函數頭文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函數狀態碼定義
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假設線性表中的元素均爲整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //循環單鏈表類型定義與單鏈表定義相同,區別在尾節點next取值
Status ListCreate_CL(LinkList &CL);
void ListDelete_CL(LinkList &CL, ElemType min, ElemType max);
void ListPrint_CL(LinkList &CL)
{ //輸出單鏈表,空表時輸出Empty List。
LNode *p=CL->next; //p指向第一個元素結點
if(p==CL){
printf("Empty List");
return;
}
while(p!=CL)
{
if(p->next!=CL)
printf("%d ",p->data);
else
printf("%d",p->data);
p=p->next;
}
}
int main()
{
LinkList CL;
ElemType min,max;
if(ListCreate_CL(CL)!= OK)
{
printf("循環鏈表創建失敗!!!\n");
return -1;
}
scanf("%d%d",&min,&max);
ListDelete_CL(CL,min,max);
ListPrint_CL(CL);
return 0;
}
/* 請在這裏填寫答案 */
輸入格式: 第一行輸入一個整數n,表示循環單鏈表中元素個數,接下來一行共n個整數,中間用空格隔開。第三行輸入min和max。
輸出格式: 輸出刪除後循環鏈表的各個元素,兩個元素之間用空格隔開,最後一個元素後面沒有空格。
輸入樣例:
6
1 2 3 4 5 6
2 5
輸出樣例:
1 2 5 6
//代碼如下
Status ListCreate_CL(LinkList &CL)//創建一個循環單鏈表(後插法){
//創建頭節點
CL = (LNode*)malloc(sizeof(LNode));/*通過malloc申請sizeof(listnode) 大小的一段連續內存空間,
並將該空間地址首地址(指針)強制轉換成listnode* 類型,並賦值給lnode變量。
這樣可以實現動態存儲;訪問時 lnode->xx;不要的時候要釋放:free(lnode);*/
if(!CL)
exit (OVERFLOW);
LNode* curPtr=CL;
LNode* rearPtr=CL;
//將CL賦給rearPtr和curPtr
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
curPtr=(LNode*)malloc(sizeof(LNode));
if(!curPtr)
exit(OVERFLOW);
//若n爲零,curPtr的next指向CL
scanf("%d",&curPtr->data);//否則,創建n個新節點
rearPtr->next=curPtr;//上一節點的next指向新節點
rearPtr=curPtr;//rearPtr指向新節點
}
curPtr->next=CL;
return OK;
}
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
LNode* curPtr;
LNode* rearPtr;
int _min=min,_max=max;
rearPtr=CL;
curPtr=CL->next;
//rearPtr指向頭節點,curPtr指向第一個節點
while(curPtr!=CL)
{
if(curPtr->data>_min&&curPtr->data<_max)
{
rearPtr->next=curPtr->next;
//滿足條件,rearPtr的next指向curPtr的下一個節點
free(curPtr);
curPtr=rearPtr->next;//釋放curPtr所指內存,並指向下一個節點
}
else
{
rearPtr=rearPtr->next;
curPtr=curPtr->next;
}//不滿足條件,尾指針和前指針都向後移一個節點
}
}