不疯魔,不成活!——单链表的创建,插入,删除等操作

无论是大学计算机相关专业的考试,亦或是各种大小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 }

 

 

 

 

转载于:https://www.cnblogs.com/yshl-dragon/archive/2012/06/30/2571179.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值