zoukankan      html  css  js  c++  java
  • 单向链表学习

    今天做的一道关于单向链表的简单的题目。

    将一个链表的倒数第pos个成员打印出来。思路很简单,首先创建一个简单的单向链表,插入相应的元素,利用2个指针head1和head2,先让head1先走pos-1个位置后,在让两个指针同时走,当head1走到最后一个节点时,此时的head2即为倒数第pos个成员的指针。

    单向链表:每个结点的存储地址放在直接前驱的指针域中,每个结点只有一个指向后继的指针。访问数据元素只能由链表头一次到链表尾,而不能逆向访问。

    单向链表又分为带头节点和不带头节点2种类型。

    带头节点的链表有效解决了“第一个结点”问题,因为链表中第一个结点是没有直接前驱的,而且它的地址是整个链表的地址,需要放在链表的头指针变量中;而其它结点都有直接前驱,其地址存放在直接前驱节点的指针域中。

    链表的插入:单向链表结点的插入是利用修改结点指针域的值,使其指向新的链接位置来实现的,不需要移动任何元素。

    链表的删除:要删除第i个结点,首先在单向链表中找到删除结点的前一个结点,并且用指针q指向它,指针p指向要删除的结点,将*q的指针域修改为待删除结点*p的后继结点地址,删除后的结点动态地释放。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 
     5 typedef int datatype;
     6 typedef struct node 
     7 {
     8     struct node *next;
     9     datatype data;
    10 }linknode,*linklist;
    11 
    12 linklist CreateEmptyLinklist()
    13 {
    14     linklist h;
    15     h = (linklist)malloc(sizeof(linknode));
    16     h->next = NULL;
    17     return h;
    18 }
    19 int lengthLinklist(linklist h)
    20 {
    21     int length = 0;
    22     h = h->next;
    23     while (h != NULL)
    24     {
    25         length++;
    26         h = h->next;
    27     }
    28     return length;
    29 }
    30 int insertLinklist(linklist h,int x,int pos)
    31 {
    32     linklist p;
    33     //p = h->next;
    34     if ((pos < 0) || (pos > lengthLinklist(h)))
    35         return -1;
    36     while (pos--)
    37     {
    38         h = h->next;
    39     }
    40     p = (linklist)malloc(sizeof(linknode));
    41     p->data = x;
    42     p->next = h->next;
    43     h->next = p;
    44     return 0;
    45 }
    46 void visitLinklist(linklist h)
    47 {
    48     linklist p;
    49     p = h->next;
    50     printf("the linklist is :");
    51     while (p != NULL)
    52     {
    53         printf("%d ",p->data);
    54         p = p->next;
    55     }
    56     printf("\n");
    57 }
    58 
    59 int seekNumber(linklist h,int pos)
    60 {
    61     linklist head1,head2;
    62     head1 = h;
    63     head2 = h;
    64     pos = pos - 1;
    65     while (pos)
    66     {
    67         pos--;
    68         if (NULL != h->next)
    69         {
    70             head1 = h->next;
    71         }
    72         else
    73         {
    74             printf("pos is notcorrespond! ");
    75             return -1;
    76         }
    77     }
    78     while (head1->next != NULL)
    79     {
    80         head1 = head1->next;
    81         head2 = head2->next;
    82     }
    83     return head2->data;
    84 }
    85 int main(int argc, char *argv[])
    86 {
    87     linklist h;
    88     h = CreateEmptyLinklist();
    89     int i = 0;
    90     for (; i < 10; i++)
    91     {
    92         insertLinklist(h,i+97,i);
    93     }
    94     visitLinklist(h);
    95 
    96     printf("\n%d \n",seekNumber(h,2));
    97     return 0;
    98 }
  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2663454.html
Copyright © 2011-2022 走看看