C语言单链表操作模板,初始化增删改查等操作
对于这次博客,博主倒是没什么好讲解的,因为单链表本质上设计的问题难点在于对指针的应用和理解。理解很重要,如果真的理解了指针,其实单链表很简单。
后续,博主准备专门写一篇关于指针的博客,来深入谈解一下操作指针的本质,
下面是单链表一些代码,可供初学者学习,是个不错的模板,当然,代码早已调通:
#include<stdio.h>
#include<stdlib.h>
#define true 1;
#define false 0;
typedef int Element;
typedef struct sqlist {
Element data;
struct sqlist* next;
}sqlist,*psqlist;
void InitSqlist(psqlist* L) {
(*L) = (sqlist*)malloc(sizeof(sqlist));
(*L)->next = NULL;
}
void headsqlist(sqlist *L,Element e){
sqlist *r;
r = (sqlist*)malloc(sizeof(sqlist));
r -> data = e;
r->next = L->next;
L->next = r;
}
void tailsqlist(sqlist* L,Element e) {
sqlist *p = L,*s;
while (p->next) {
p = p->next;
}
s = (sqlist*)malloc(sizeof(sqlist));
s->data = e;
s->next = p->next;
p->next = s;
}
void printsqlist(sqlist* L) {
sqlist* p = L->next;
while (p) {
printf("%d \n", p->data);
p = p->next;
}
}
sqlist* positionsqlist(sqlist *L, int i) {
sqlist *p = L->next;
int j = 0;
if (i <= 0) return NULL;
while (p) {
j++;
if (i == j)return p;
else p = p->next;
}
return NULL;
}
sqlist * valuesqlist(sqlist* L, Element e) {
sqlist* p = L->next;
while (p) {
if (p->data == e)return p;
p = p->next;
}
return NULL;
}
int length(sqlist* L) {
sqlist *p = L;
int length=0;
while (p->next) { p = p->next; length++; }
return length;
}
int positiondelete(sqlist* L, int i) {
sqlist* p = L, *s;
int j = 0;
if (i <= 0) return NULL;
while (j < i-1 && p->next) {
p = p->next;
j++;
}
if (j == i-1) {
s = p->next;
p->next = s->next;
free(s);
return true;
}
else { return false; }
}
int positioninsert(sqlist* L, int i,Element e) {
sqlist* p = L, * s;
int j = 0;
if (i <= 0) return NULL;
while (j < i - 1 && p->next) {
p = p->next;
j++;
}
if (j == i - 1) {
s = (sqlist*)malloc(sizeof(sqlist));
s->data = e;
s->next = p->next;
p->next = s;
}
else { return false; }
}
int valuedelete(sqlist* L, Element e) {
sqlist* p = L->next, * s;
while (p) {
if (p->data == e) {
s = p->next;
p->next = s->next;
free(s);
return true;
}
p = p->next;
}
return false;
}
void main() {
sqlist* L;
sqlist* p;
int i;
int l;
InitSqlist(&L);
headsqlist(L, 6);
tailsqlist(L, 5);
for (i = 0; i <= 10; i++) {
tailsqlist(L, i);
}
printsqlist(L);
p = positionsqlist(L, 5);
printf(" zz :%d \n", p->data);
p = valuesqlist(L, 7);
printf("%d \n", p->data);
l = length(L);
printf("legtnh is %d ", l);
l=positiondelete(L, 5);
l = length(L);
printf("now, legtnh is %d ", l);
printf("\n print this sqlist:\n");
printsqlist(L);
l =valuedelete(L, 5);
l = length(L);
printf("now,value delete legtnh is %d ", l);
printf("\n print this sqlist:\n");
printsqlist(L);
l = positioninsert(L, 5,66);
l = length(L);
printf("now,position insert legtnh is %d ", l);
printf("\n print this sqlist:\n");
printsqlist(L);
printf("\nhello");
system("pause");
}