回 帖 发 新 帖 刷新版面

主题:关于循环链表---初学者发问

请问我建立了如下一个单循环链表,现在我想设置一个函数将其清空,该如何实现?
谢谢各位大侠!


#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct lnode{
    int num;
    int pwl;
    struct lnode *next;
}lnode;
 lnode *initlist(int n){
    lnode *p,*q,*head;
    p=(lnode *)malloc(sizeof(lnode));
    head=p;
    for(int i=1;i<n+1;++i){
    p->num=i;
        cin>>p->pwl;
        q=p;
        p=(lnode *)malloc(sizeof(lnode));
        q->next=p;
    }
    q->next=head;
    return head;
}//创建含n个节点的循环链表,返回头指针。

回复列表 (共2个回复)

沙发

void delete (lnode *head)
{
    lnode *p = head->next;
    lnode *temp;

    for (;p->next != head;) {
        temp = p->next;
        free (p);
        p = temp;
    }
    free (head);
}

板凳

谢谢你,可是用了你的函数之后,我在用我自己写的输出函数printlist输出链表元素总是出错.而用我自己写的清空链表函数clearlist就没有问题
而当我对你的函数做如下修改之后就没有问题了.这是什么原因?
请指点.谢谢!

void delete(lnode *&head)  //*head 改为*&head即改为引用形式
{
    lnode *p = head->next;
    lnode *temp;

    for (;p->next != head;) {
        temp = p->next;
        free (p);
        p = temp;
    }
    head=NULL;        //free(head)   改为 head=NULL
}

附:我自己写的函数
void printlist(lnode *first)     //输出链表
{
    cout<<"This list contains:\n"<<endl;
    lnode *r;
    r=first;
    cout<<"The nums are:"<<endl;
    while(r)
    {
        cout<<' '<<r->num;
        r=r->next;
        if(r==first)break;
    }
    cout<<"\n";
    r=first;
    cout<<"The pwls are:"<<endl;
    while(r)
    {
        cout<<' '<<r->pwl;
        r=r->next;
        if(r==first)break;
    }
    cout<<"\n";
}


void clearlist(lnode * &first)   //清空链表
{
    lnode *r,*p;
    r=first;
    while(r)
    {
        r=r->next;
        p=r->next;
        free(r);
        r=p;
        if(r==first)break;
    }
    first=NULL;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册