链表的插入遍历查询-之玩转代码

来源:互联网 发布:iphone数据用不了 编辑:程序博客网 时间:2024/05/16 05:10

链表是一种算法,链表的基础就是指针。

指针就是地址,指针变量就是能存放地址的变量。所以指针变量可以被赋值,这也就造就了链表。链表的每一个结点,都用首地址来表示。当前结点的地址变量可以被赋值为下一个结点的地址,这样循环下去就形成了链表。同时,把某个结点的地址赋给指针变量,就可以通过这个指针变量来访问这个节点的内容了。

指针特点:

1 指针变量加1,即向后移动1 个位置表示指针变量指向下一个数据元素的首地址。而不是在原地址基础上加1

2 设p为指针变量,则p==0表明p是空指针,它不指向任何变量;

3 对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。

 

 

 

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <malloc.h>
  4 #include <stdbool.h>
  5
  6 #define N 3
  7 #define TARGET 22
  8
  9 typedef unsigned int uint;
 10 typedef struct DATA{
 11     uint data;
 12     struct DATA *next;
 13 }DATA;
 14
 15 static DATA *head, *p_current,*p_tail;
 16
 17 void creat(void);
 18 void search(uint data);
 19 void input(void);
 20 /**************************************

       *Description : 此函数实现初始化链表的首结点

       **************************************/
 21 void creat()
 22 {
 23     head =(DATA *)malloc(sizeof(DATA));
 24
 25     if(head!=NULL)
 26     {
 27         head->data=20;
 28     }
 29     p_current=head;
 30 }
 31 /**************************************

       *Description : 此函数实现增加链表的功能

       **************************************/
 32 void input(void)
 33 {
 34     uint data ,i;
 35     for(i=0;i<N;i++)
 36     {
 37         scanf("%d",&data);

 38

 39         p_tail=(DATA *)malloc(sizeof(DATA));

 40         if(p_tail!=NULL)

 41         {

 42             if(p_current->data>=data)

 43             {

 44                 p_tail->data=p_current->data;

 45                 p_current->data=data;

 46                 p_current->next=p_tail; //move the point

/*47行是移动指针的作用,但是在一开始我没有写上此句,导致链表不能形成*/

 47                 p_current=p_current->next;

 48             }

 49             else

 50             {

 51                 p_tail->data=data;

 52                 p_current->next=p_tail; //move the point

 53                 p_current=p_current->next;

 54             }

 56         }

 57     }

 58     p_current->next=NULL;

 59 }

 60 static int Index=0;

 61 /*********************************************

       *Description : 此函数实现查找链表结点,输出该节点的索引

       **********************************************/

 62 void search(uint data)

 63 {

 64     DATA *p;

65      p=head;      

/*66行,我用过p>next!=NULL 

导致链表丢失一个结点*/                                                       

66     while(p!=NULL)
 67     {
 68         if(data==p->data)
 69             break;
 70         p=p->next;  //
移动指针到下一个结点

 71         Index++;
 72     }
 73 }
 74
 75 void print(void)
 76 {
 77     DATA *p;
 78     p=head;
 79     printf("---the link value is ");
 80     while(p!=NULL)
 81     {
 82         printf("   %d",p->data);
 83         p=p->next;
 84     }
 85     printf("/n");
 86 }
 87
 89 int main()
 90 {
 91     creat();
 92     input();
 93     print();
 94     search(TARGET);
 95     if(Index<=N)
 96         printf("---the value Index is %d----/n",++Index);
 97     else
 98         printf("---the value is not exist---/n");
 99
100     return 0;
101 }

原创粉丝点击