数据结构与算法之单链表(1)

来源:互联网 发布:2015淘宝交易额 编辑:程序博客网 时间:2024/06/05 01:00

在说头插法建立单链表之前,先补充几个知识点:

用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;
}

原创粉丝点击