今天做的一道关于单向链表的简单的题目。
将一个链表的倒数第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 }