本代码在QT控制台环境下测试通过,如果在其他IDE下,注意修改包含的打印头文件即可。
#include <QCoreApplication>
#include <malloc.h>
#include <iostream>
/*
*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();
}