https://blog.csdn.net/sinat_38486449/article/details/80194132
一、单链表的建立:
单链表的建立有2种方法:
(1)头插法,关键语句:
node1->next=head->next; //新结点指向原来头结点的后面一个结点
head->next=node1; //头结点指向新结点
#include<stdio.h>
#include<malloc.h>
#include<time.h>
#include<stdlib.h>
struct node //建立结构体
{
int data; //elementype表示一种数据类型,可能是int/char等等
struct node *next; //next 指针,用于链表结构指向下一个节点
};
typedef struct node node; //重定义struct node类型为node
node* Creat(node* head,int count) //创建链表
{
head->data++;
node* node1 = (node*)malloc(sizeof(node));
if(node1 == NULL)
{
return NULL;
}
node1->data=count;
node1->next=head->next;
head->next=node1;
return head;
}
void List(node* head) //打印链表
{
node *p1;
p1 = head;
while(p1!= NULL)
{
printf("%4d",p1->data);
p1 = p1->next;
}
}
int main() //主函数
{
printf("Enter the number of linked list nodes:\n");
node* head = (node*)malloc(sizeof(node));
if(head == NULL)
{
return 0;
}
int Num;
while(1)
{
scanf("%d",&Num);
if(Num ==0)break;
head = Creat(head,Num);
}
printf("List:\n");
List(head);
printf("\n");
}
(2)尾插法:关键语句:
head = p1 = (node*)malloc(sizeof(node)); //申请两个变量,一个是head,两一个是p1,指向表尾
p1=p2; // 作用是:只要新结点插入进去了,那么他就会变成尾部结点。然后不断重复这个操作。
head = p1 = (node*)malloc(sizeof(node)); //p1为指向表尾结点的指针
head->data = rand()%1000;
head->next = NULL;
for (n = 1;n < Count;n++)
{
p2 = (node*)malloc(sizeof(node)); //p2为新申请的结点
p2->data = rand()%1000;
p1->next = p2; //将表尾结点的指针指向新结点
p1 = p2; //将当前的新结点定义为表尾终端节点
}
p1->next = NULL; //循环结束后最终的尾结点的指针赋值为NULL
二、二叉树的创建,前序创建:判断根节点为NULL;
二叉树的遍历,前序 中序和后续的差别仅在于 cout<<T->data<<" ";的位置。
#include<iostream>
using namespace std;
//定义节点
typedef struct node
{
struct node *lchild;
struct node *rchild;
char data;
}BiTreeNode,*BiTree; //*BiTree的意思是给 struct node*起了个别名,叫BiTree,故BiTree为指向节点的指针。
//按照前序顺序建立二叉树
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{
char c;
cin >> c;
if('#' == c) //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new BiTreeNode;
T->data=c;
cout << "T->data =" <<T->data <<endl;
createBiTree(T->lchild);
cout <<"*****" <<endl;
createBiTree(T->rchild);
}
}
//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
if(T)
{
#include<iostream>
using namespace std;
//定义节点
typedef struct node
{
struct node *lchild;
struct node *rchild;
char data;
}BiTreeNode,*BiTree; //*BiTree的意思是给 struct node*起了个别名,叫BiTree,故BiTree为指向节点的指针。
//按照前序顺序建立二叉树
void createBiTree(BiTree &T) //&的意思是传进来节点指针的引用,括号内等价于 BiTreeNode* &T,目的是让传递进来的指针发生改变
{
char c;
cin >> c;
if('#' == c) //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
T = NULL;
else
{
T = new BiTreeNode;
T->data=c;
cout << "T->data =" <<T->data <<endl;
createBiTree(T->lchild);
cout <<"*****" <<endl;
createBiTree(T->rchild);
}
}
//前序遍历二叉树并打印
void preTraverse(BiTree T)
{
if(T)
{
cout<<T->data<<" ";
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
int main()
{
BiTree T; //声明一个指向二叉树根节点的指针
createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout <<endl;
cout<<"前序遍历二叉树:"<<endl;
preTraverse(T);
cout<<endl;
return 0;
}
preTraverse(T->lchild);
cout<<T->data<<" ";
preTraverse(T->rchild);
}
}
int main()
{
BiTree T; //声明一个指向二叉树根节点的指针
createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout <<endl;
cout<<"前序遍历二叉树:"<<endl;
preTraverse(T);
cout<<endl;
return 0;
}