手动输入数据完成链表的 头插、尾插
#include "stdafx.h"
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node;
#if 0
//头插法完成动态链表的创建与输出
//头插法输出列表的是倒序的
//head指针的位置永远不变
Node *createList()
{
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;//先创建一个空链表
Node* cur = NULL;//新节点的指针
int data;
printf("请输入节点数据:");
scanf("%d", &data);
while (data)//为了实现动态连接节点,设置输入数据为0时不再连接
{
cur = (Node*)malloc(sizeof(Node));//为新节点开辟空间
cur->data = data;
cur->next = head->next;//让新节点有所指向
head->next = cur;//头节点与新节点连接
scanf("%d", &data);//再次输入
}
return head;
}
#endif
//尾插法
//尾插法输出列表是正序的
Node *createList()
{
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
Node* pt = head;//创建一个直指向尾节点的指针
Node* cur = NULL;
int data;
printf("请输入节点数据:");
scanf("%d", &data);
while (data)
{
cur = (Node*)malloc(sizeof(Node));
cur->data = data;
pt->next = cur;//将新节点连接到原尾节点的后面
cur->next = NULL;//将新节点定义成尾节点
pt = cur;//pt=pt->next;将原来的尾指针后移
scanf("%d", &data);
}
return head;
}
//链表的遍历
void traverseList(Node * head)
{
head = head->next;
//从头结点的下一个节点开始输出(头结点的data没有值)
//此处判断实际是通过让head指向下一个节点后,
//再来判断上一个节点的nest值是否为NULL
while (head != NULL)
{
printf("%d\n", head->data);
head = head->next;
}
}
//不用担心调用后头指针的位置,头指针还是在头,
//只有参数为二级指针才能改变一级指针的指向
//参数只有一个一级指针相当于原指针的一个副本,改变副本的指向不会影响原指针
//求链表的长度
int lenList(Node* head)
{
int len = 0;
head = head->next;
while (head != NULL)
{
len++;//链表的长度是不算头结点的长度的
head = head->next;
}
return len;
}
int _tmain(int argc, _TCHAR* argv[])
{
Node *head = createList();
traverseList(head);
int len = lenList(head);
printf("链表长为%d\n", len);
return 0;
}