在说头插法建立单链表之前,先补充几个知识点:
用typedef定义类型:意思就是可以用typedef声明新的类型名来代替已有的类型名。
例如:
typedef struct
{
int month;
int day;
int year;
}DATE;
声明新类型名DATE,它代表上面指定的一个结构体类型。这是就可以用DATE定义变量: DATE birthday;
DATE *p; (p为指向此结构体类型数据的指针)
typedef int (*POINTER)() (声明POINTER为指向函数的指针类型,该函数返回整型值)
malloc函数:
其函数原型为 void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。如果函数未能成功执行(例如内存空间不足),则返回空指针(NULL)。
1、建立单链表
假设线性表中结点的数据类型是字符,我们逐个输入这些字符型的结点,并以换行符'\n'为输入条件结束标志符。动态地建立单链表的常用方法有如下两种:
(1) 头插法建表
① 算法思路
从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。
整体程序如下:
#include<iostream>
using namespace std;
typedef struct node
{
char data;
struct node *next;//next是指针类型的成员,它指向struct node类型数据
}Listnode;
/*前插法创建单链表*/
Listnode *Createlist_former(void) //函数的返回值是指针类型,因为最后要返回链表的首地址
{
char ch;
Listnode *p,*head;
head=NULL;/*建立头结点*/
cout<<"Please input some char: ";
ch=getchar();
while (ch!='\n')
{
p=(Listnode *)malloc(sizeof(Listnode));
p->data=ch;
p->next=head;//因为是头插法,输入的第一个结点(每个结点包括两个部分:用户需要用的实际数据,下一个结点的地址)中的下一个结点的地址应为NULL;
head=p;//把第一个结点的起始地址赋给下一个结点(即第二个结点)此后类推
ch=getchar();
}
return head;
}
/*输出链表*/
void print_list(Listnode *head)
{
Listnode *p;
p=head;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
}
char main()
{
Listnode *head;
head=Createlist_former();
cout<<"The print of list: ";
print_list(head);
cout<<endl;
}