数据结构之链表学习(1)

来源:互联网 发布:广州网络优化 编辑:程序博客网 时间:2024/06/05 10:30

(1)  链表包括:数据域和指针域

因此在用结构体定义链表的代码为

typedef struct node

{

   int data;//数据域

   struct node *pnext;//指针域

}Node, *pNode;

(2)  创建链表

1.   介绍一个函数malloc,此函数的作用是在内存的动态存储区中分配一块连续的空间。其原型为:void *malloc(unsigned  intsize);如果此函数因某些原因(内存不足)未能执行成功,则会返回一个空指针(NULL)。

2.   在创建链表的过程中的一个难点是:怎样将多个节点连接起来。即用代码怎样实现。在函数中我定义了三个变量Head,p1,p2.Head 的作用是记录头节点的地址。p1的作用是用来暂存后面申请到的节点的地址。p2的作用是用来把各个节点联系起来。通过p2这个中介,可以把刚申请到的节点连接到已经生成的链表的后面。

(3)  链表的遍历

在链表遍历的过程中遇到的几个问题:

1、到底使用for循环还是用while循环输出值得问题。经过不断的改进觉得这种方式比较不错

while(1)

{

   if(p1->pnext == NULL)

   {

       printf("%d ",p1->data);

       break;

   }

   printf("%d ",p1->data);

   p1 = p1->pnext;

}

首先检测p1->pnext是否等于NULL,如果是,则输出该节点的数据。其实这个if判断主要是用来输出链表中的最后面的一个数据。因为在这之前输出的数据中总是缺少最后一个数据。如果p1->pnext !=NULL,则输出该节点的值,同时将p1指向下一个节点的地址,以便读取下一个节点的数据。

2、还遇到一个问题是:遍历之后再第一个数据的前面出现莫名其妙的数据


其实出现这个问题的主要原因是:在申请头结点Head的时候,并没有给它的数据域赋值。但在遍历的时候就是从这个节点开始遍历的。刚开始将p1 = Head,其实这个应该改为p1 = Head->next.

3、当输入测试数据‘0’时,然后就会出现错误,原因是在申请了Head头结点后忘记了个它的pnext置为空指针的原因。

代码如下:

#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct node{    int data;//数据域    struct node *pnext;//指针域}Node, *pNode;/**创建链表**/pNode Create_node(void){    pNode Head, p1, p2;    int val,num,i;    Head = (pNode)malloc(sizeof(Node));//p=(struct node *)malloc(sizeof(struct node))
    Head->pnext == NULL;    if(Head == NULL)    {        printf("内存分配失败,程序终止");        exit(-1);    }    //////////////////////////////////////////////////    p2 = Head;    printf("请输入创建节点的个数:");    scanf("%d",&num);    for(i = 0; i < num; i ++)    {        printf("请输入节点的值:");        scanf("%d",&val);        p1 = (pNode) malloc(sizeof(Node));        p1->pnext = NULL;        p1->data = val;        p2->pnext = p1;        p2 = p1;    }    return Head;}/**遍历链表**/void traverse_list(pNode Head){    pNode p1;    p1 = Head->pnext;//注意此处不是p1 = Head,而是p1 = Head->pnext    printf("遍历后输出的值为:");    while(1)    {        if(p1->pnext == NULL)        {            printf("%d ",p1->data);            break;        }        printf("%d ",p1->data);        p1 = p1->pnext;    }}int main(void){    pNode pHead;    pHead = Create_node();    traverse_list(pHead);    return 0;}


0 0