狐狸梦见乌鸦

当坚持成为一种习惯,目标将不在遥远```
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单向链表学习

Posted on 2012-08-30 11:51  灬啊U  阅读(252)  评论(0编辑  收藏  举报

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

将一个链表的倒数第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 }