C语言实现单向(循环)链表的创建和遍历

本代码在QT控制台环境下测试通过,如果在其他IDE下,注意修改包含的打印头文件即可。

#include 
#include 
#include 

/*
 *2018-08-24 13:23:03
 * 单向链表测试
 * 包括循环链表的实现
*/

using namespace std;
typedef struct Node{
    struct Node *next;
    int data;
}Node;


//带有头结点的头插法方式创建单链表,就是说,头结点指向一直在变化,永远指向最后创建的结点。把注释的代码打开就是循环链表
Node * creatList1(int nodenum){
    Node *temp;
    Node *head = (Node*)malloc(sizeof(Node));   //创建头结点
//    Node *tail=NULL;
    if(head == NULL){
        cout<<"头结点分配失败"<<endl;
    }
    head->next=NULL;
    head->data=nodenum;
    for(int i=1;i<=nodenum;i++){
        temp = (Node*)malloc(sizeof(Node));
//        if(i==1){
//           tail=temp;
//        }
        temp->data=i;
        temp->next=head->next;  //使用头插法
        head->next=temp;
    }
//    tail->next=head;  //注意:带有头结点的链表,循环遍历,第一次循环以后会多遍历一个头结点的值
    return head;
}

//带有头结点的尾插法方式创建单链表,就是说,头结点指向不变,永远指向最先创建的结点。把注释的代码打开就是循环链表
Node * creatList2(int nodenum){
    Node *temp,*tail;
    Node* head = (Node*)malloc(sizeof(Node));   //创建头结点
    if(head == NULL){
        cout<<"头结点分配失败"<<endl;
    }
    head->next=NULL;
    head->data=nodenum;
    tail=head;//此时尾巴指向头,即尾巴和头代表同一个结点
    for(int i=1;i<=nodenum;i++){
        temp = (Node*)malloc(sizeof(Node));
        temp->data=i;
        temp->next=tail->next;  //使用尾插法
        tail->next=temp;
        tail=temp;      //移动尾指针
    }
//    tail->next=head;  //注意:带有头结点的链表,循环遍历,第一次循环以后会多遍历一个头结点的值
    return head;
}

//不带头结点的头插法,把注释的代码打开就是循环链表
Node * creatList3(int nodenum){
    Node *temp;
    Node *head = NULL;
//    Node *tail=NULL;
    for(int i=1;i<=nodenum;i++){
        temp = (Node*)malloc(sizeof(Node));
//        if(i==1){
//            tail=temp;    //此处记录最后一个结点的地址
//        }
        temp->data=i;
        temp->next=head;    //使用头插法
        head=temp;  //移动头指针
    }
//    tail->next=head;  //最后一个结点指向头结点
    return head;
}

//不带头结点的尾插法,把注释的代码打开就是循环链表
Node * creatList4(int nodenum){
    Node *temp;
    Node *head;
    Node *tail;
    head=tail=NULL;
    for(int i=1;i<=nodenum;i++){
        temp = (Node*)malloc(sizeof(Node));
        temp->data=i;
        if(NULL == head){   //如果第一个结点不存在,即空链表
            head=tail=temp;     //设置第一个结点
            head->next=NULL;
        }
        else{//链表非空
             temp->next=tail->next ;
             tail->next=temp;
        }
        tail = temp;    //移动尾指针
    }
//    tail->next=head;  //加上此句就变成循环链表
    return head;
}

int main(int argc, char *argv[])
{
    #define withhead
    QCoreApplication a(argc, argv);
    Node *head=creatList1(5);
    cout<<head<<endl;
    #ifdef withhead
    Node *p=head->next;//有头结点则忽略头结点的值
    #endif
    #ifdef nohead
    Node *p = head;
    #endif
    while(p!=NULL){
        cout<<p->data<<endl;
        p=p->next;
    }
    return a.exec();
}

你可能感兴趣的:(c++)