C语言链表
C语言链表是一个很有用的东西,它在不连续存储的情况下极大效率利用了内存。不过要理解C语言链表不是一个很容易的事情。在操作链表的过程中的中心思想是我们只保存链表的头部,后边的操作都是获取到头部之后进行链表的增删,对链表头部本身那个变量是不动的。
从最简单的单向表开始:
单向表的结构如图:(图片来自百度)

单向表只有两个元素:数据和下一个节点,结构如下:
typedef struct st { int data; struct st * next; }NODE;
单相表只有一个表头,表上最后一个元素指向NULL。
创造一个链表:
NODE * createNODE(int n) { NODE *h , *node , *e; h = (NODE*)malloc(sizeof(NODE)); e = h; for(int i = 0 ; i < n ; i ++) { node = (NODE*)malloc(sizeof(NODE)); node->data = i; e->next = node; e = node; } e->next = NULL; return h; }
改变链表里面的元素:
void changeNODE(NODE *list , int n , int data) { NODE *t = list; int i; while((i < n ) && t != NULL) { t = t->next; i ++; } if(t != NULL) { t->data = data; } else { puts("节点不存在"); } }
删除链表里的某个节点:
void deleteNODE(NODE *list, int n ) { NODE *t = list , *in; int i = 0; while((i < n ) && t != NULL) { in = t ; t = t->next; i ++; } if(t != NULL) { in->next = t ->next; free(t); } else { puts("节点未打开"); } }
在链表上插入节点:
void insertNODE(NODE *list , int n , int data) { NODE *t = list , *in; int i= 0; while((i < n ) && t != NULL) { t = t -> next; i ++; } if(t != NULL) { in = (NODE*)malloc(sizeof(NODE)); in->data = data; in->next = t->next; t->next = in ->next; } else { puts("节点不存在"); } }
打印链表元素:
void showNODE(NODE *h) { NODE *t; t = h; while(t != NULL) { printf("%d " , t->data); t = t -> next; } printf("\n"); }
在使用链表的时候要保证头部不变:
int main(int argc ,char **argv) { const NODE *c; // 这是链表头部 c = createNODE(5); showNODE(c); changeNODE(c,2,333); showNODE(c); deleteNODE(c , 4); return 1; }
单向链表就这么简单。
浙公网安备 33010602011771号