不疯魔,不成活!——单链表的创建,插入,删除等操作
无论是大学计算机相关专业的考试,亦或是各种大小IT公司的笔试面试,
只要考C语言(或者C++),
有三点是永远的主题——指针,链表,二叉树。
今天写下这篇博客,初步研究一下链表,
是最简单的链表——单链表。
不说废话,action!
单链表在定义的时候有两种形式——带头结点的的单链表,不带头结点的单链表.
他们在很多操作方面都有区别的,如:
1 带头结点的链表,在插入元素的时候我们无需对插入第一个位置考虑很多,它完全可以像普通的插入一样操作。
而无头结点的链表,必须的考虑头指针的变动。删除操作亦是如此。
2 带头结点的链表初始化,只需定义一个头结点变量,然后对头结点中的元素初始化即可。
而无头结点的链表需定义一个节点指针,并对其进行初始化。
3 易知,带头结点的链表在管理时比较方便。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //定义节点类型,不带头结点: 5 typedef struct LNode 6 { 7 int data; 8 struct LNode *next; 9 }LNode, *Link; 10 11 //定义节点类型,带头结点: 12 typedef struct LNode{ 13 int data; 14 struct LNode *next; 15 16 }LNode,*Link; 17 18 typedef struct LinkList{ 19 Link head; 20 int length; 21 }LinkList; 22 23 24 /*------------------------------------------------*/ 25 26 //初始化,不带头结点: 27 void InitList(Link *L) 28 { 29 Lhead = NULL; 30 } 31 32 //初始化,带头结点: 33 void InitList(LinkList *L) 34 { 35 L->head = NULL; 36 L->length = 0; 37 } 38 39 40 /*------------------------------------------------*/ 41 42 //销毁, 不带头结点: 43 void DestroyList(Link *L) 44 { 45 Link p = *L; 46 while(p != NULL){ 47 (*L) = *L->next; 48 free(p); 49 p = *L; 50 } 51 } 52 53 //销毁, 带头结点: 54 void DestroyList(LinkList *L) 55 { 56 Link p = L->head; 57 while(p != NULL){ 58 L->head = L->head->next; 59 free(p); 60 p = L->head; 61 } 62 } 63 64 65 /*------------------------------------------------*/ 66 67 //判断链表为空, 不带头结点的: 68 int ListEmpty(Link L) 69 { 70 if(L == NULL){ 71 return 1; 72 } 73 return 0; 74 } 75 76 //判断链表为空, 带头结点的: 77 int ListEmpty(LinkList L) 78 { 79 if(L.head == NULL){ 80 return 1; 81 } 82 return 0; 83 } 84 85 86 /*------------------------------------------------*/ 87 88 //获得链表长度, 不带头结点的: 89 int ListLength(Link L) 90 { 91 int len = 0; 92 Link p = L; 93 while (p != NULL){ 94 ++len; 95 p = p->next; 96 } 97 return len; 98 } 99 100 //获得链表长度, 带头结点的: 101 int ListLength(LinkList L) 102 { 103 return L.length; 104 } 105 106 107 /*------------------------------------------------*/ 108 109 //插入,不带头结点: 110 void ListInsert(Link *L,int i,int e) 111 { 112 int j = 1; 113 Link p,q; 114 if (L == NULL){ 115 *L = p; 116 p->next = NULL; 117 return; 118 } 119 q = *L; 120 while (q != NULL && j < i){ 121 ++j; 122 q = q->next; 123 } 124 if (q == NULL){ 125 printf("ilegle position %d(i)./n",i); 126 return; 127 } 128 p = (Link)malloc(sizeof(LNode)); 129 p->elem = e; 130 p->next = q->next; 131 q->next = p; 132 } 133 134 //插入,带头结点 135 void ListInsert(LinkList *L,int i,int e) 136 { 137 Link p,q; 138 int j = 1; 139 if (i <= 0 || i > L->length+1){ 140 printf("ilegle position %d(i)",i); 141 return; 142 } 143 p = (Link)malloc(sizeof(LNode)); 144 p->elem = e; 145 q = L->head; 146 if (L->length == 0){//如果链表为空. 147 L->head = L->tail = p; 148 p->next = NULL; 149 ++L->length; 150 return; 151 } 152 if (i == L->length+1){//在最后插入结点. 153 L->tail->next = p; 154 L->tail = p; 155 ++L->length; 156 return; 157 } 158 while (j < i){ 159 ++j; 160 q = q->next; 161 } 162 q->next = p->next; 163 p->next = q; 164 ++L->length; 165 } 166 167 168 /*------------------------------------------------*/ 169 170 //删除操作;不带头结点的: 171 void ListDelete(Link *L,int i) 172 { 173 Link p,q; 174 int j = 1; 175 if ((*L) == NULL){ 176 printf("ListDelete cannot operate on empty list./n"); 177 return; 178 } 179 if (i == 1){ 180 q = (*L); 181 *L = (*L)->next; 182 free(q); 183 return; 184 } 185 p = *L; 186 while (p != NULL && j < i){ 187 ++j; 188 p = p->next; 189 } 190 if (p == NULL){ 191 printf("ilegle position %d(i)/n",i); 192 return; 193 } 194 q = p->next; 195 p->next = q->next; 196 free(q); 197 } 198 199 //删除操作;带头结点的: 200 void ListDelete(LinkList *L,int i) 201 { 202 int j; 203 Link p,q; 204 if (L->head == NULL || i <= 0 || i > L->length) 205 return; 206 207 p = L->head; 208 if (i == 1){ 209 q = p->next; 210 p->next = q->next; 211 L->head = p->next; 212 free(q); 213 --L->length; 214 return; 215 } 216 j = 1; 217 while (j < i){ 218 ++j; 219 p = p->next; 220 } 221 if (i == L->length){ 222 q = p->next; 223 p->next = NULL; 224 L->tail = p; 225 free(q); 226 --L->length; 227 return; 228 } 229 q = p->next; 230 p->next = q->next; 231 free(q); 232 --L->length; 233 }