PTA 數據結構 6-1 循環單鏈表區間刪除

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;
        }//不滿足條件,尾指針和前指針都向後移一個節點
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章