链表的出现解决了数组不能在程序中进行调整的弊病,增加了程序设计的灵活性。

链表分为:单链表、循环链表、双向链表。

1.单链表

  head->node1->node2->.........nodeN.

解析:

 (1)单链表的head节点是头结点,指向链表在内存的首地址。

(2)链表中的每一个结点的数据类型为结构类型,且含有数据成员(头结点没有数据成员)和一个指向下一个node的指针(未结点数据结构没有指向下一个结点的指针)。

(3)链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为N U L L

(4)结点定义:

struct node

{

int num;

struct node *p;

} ;

在链表节点的定义中,除一个整型的成员外,成员p是指向与节点类型完全相同的指针

在链表节点的数据结构中,非常特殊的一点就是结构体内的指针域的数据类型使用了未定义成功的数据类型。这是在C中唯一规定可以先使用后定义的数据结构。

(5)单链表创建实例: 创建一个存放正整数(输入- 9 9 9做结束标志)的单链表,并打印输出。

 

#include<stdlib.h>/*包含malloc()的头文件*/
#include<stdio.h>
/*l链表结点结构定义*/
struct node
{
    int num;
    struct node *next;
}
main()
{
    struct node *creat();/*函数声明*/
    void printf();
    struct node *head;
    head=NULL;/*建立一个空表*/
    head=creat(head);/*调用函数,创建单链表*/
    printf(head);/*打印单链表*/
}

struct node *creat(struct node*head)
{
    struct node *p1,*p2;
    p1=p2=(struct node *)malloc(sizeof(struct node));/*申请新节点*/
    scanf("%d",&p->num);;/*输入结点的值*/
    p1->next=NULL;/*将新节点的指针置为空*/
    while(p1->num>0)/*输入节点的数值大于0*/
    {
    if(head==NULL)
    {
    head=p1;/*空表,接入表头*/
    }
    else
    {
    p2->next=p1;/*非空表,接到表尾*/
    }
    p2=p1;
    p1=(struct node*)malloc(sizeof(struct node));/*下一个新节点*/
    scanf("%d",&p1->num);/*输入节点的值*/
    }
    return head;/*返回链表的头指针*/
}

void print(struct node*head)/*出以head为头的链表各节点的值*/
{
    struct node *temp;
    temp=head;/*取得链表的头指针*/
    while(temp!=NULL)/*只要是非空表*/
    {
    printf("%6d",temp->num);/*输出链表节点的值*/
    temp=temp->next;/*跟踪链表增长*/
    }
}

 

2.双向链表

 

阅读全文
类别:默认分类 查看评论
posted on 2010-12-15 04:28  sinbad_li  阅读(301)  评论(0编辑  收藏  举报