SZUOJ链表题

单向链表

#include 
using namespace std;
struct ElementType //数据类型
{
    int data;
    bool operator < (const ElementType &h)const{
        return data < h.data;
    }
};
struct ListNode
{
    int data;
    ListNode * nxt;
    ListNode(){
        data=-1,nxt = NULL;
    }
};
ListNode* InitNewList(){ //头结点不放任何元素
        ListNode *Head = new ListNode;
        return Head;
}
int GetLength(ListNode* Head){ //求表长
    ListNode* temp = Head->nxt;
    int length = 0;
    while(temp){
        temp = temp->nxt;
        length++;
    }
    return length;
}
ListNode* FindKth(int K,ListNode* Head){ //找链表中的第i个位置
    ListNode* i = Head;
    int cnt;
    for(cnt=0; i!=NULL && cnt<K; i=i->nxt,cnt++){;}
        if(cnt==K)  return i;
    return NULL;
}
ListNode* Find(int value,ListNode* Head){
    for(ListNode* i = Head->nxt;i!=NULL;i=i->nxt){
        if(i->data==value)  return i;
    }
    return NULL;
}
ListNode* InsertNodeInKth(int data,int K,ListNode* Head){
    ListNode *i,*p;
    p = FindKth(K-1,Head);
    if(p!=NULL){
        i = new ListNode;
        i->data = data;
        i->nxt = p->nxt;
        p->nxt = i;
        return i;
    }
    else return NULL;
}
void InsertNode_back(int data,ListNode* &Tail){
    ListNode *p = new ListNode;
    Tail->nxt = p;
    p->data = data;
    Tail = p; //修改尾指针的位置
}
void Print(ListNode* Head){
    cout<<GetLength(Head)<<' ';
    int j=0;
    for(ListNode* i = Head->nxt;i!=NULL;i=i->nxt,j++){
        cout<<i->data<<' ';
    }
    cout<<endl;
}
bool DeleteNode(int K,ListNode* Head){
    ListNode *p = FindKth(K-1,Head);
    if(p==NULL) return false;
    else{
        ListNode *q = FindKth(K,Head);
        if(q==NULL)return false;
        p->nxt=q->nxt;
    }
    return true;
}
int main()
{
    int n;
    cin>>n;
    ListNode* Head = InitNewList();
    ListNode* Tail = Head;
    for(int i = 0, x; i < n; i++){
        cin>>x;
        InsertNode_back(x,Tail);
    }
    Print(Head);
    int m;
    cin>>m;
    for(int i=0,x;i<m;i++){
        cin>>x;
        ListNode* p = FindKth(x,Head);
        if(p!=NULL && p!=Head){
            cout<<p->data<<endl;
        }
        else cout<<"error"<<endl;

    }
    return 0;
}

基本上查找,打印,删除,插入都实现了,那四道题改下细节就好了。

你可能感兴趣的:(OJ题)