链表

来源:互联网 发布:英国皇家摄影协会 知乎 编辑:程序博客网 时间:2024/05/17 06:33

链表的原理比较容易理解,但很多教材上都是伪代码,导致写出第一个完整可运行代码花了不少时间(自己太蠢,代码量太少了),现在把我写的代码贴出来分享。
这个代码不是非常完善,仅供初学者或者看了伪代码,明白了原理,但写不出完整代码的同学参考。如有错误的地方,烦请大神指出,一定改正。
代码如下:

#include <stdio.h>#include <stdlib.h>struct node {    int data;    struct node *next;};//此数组为加入链表的待用数值int str[5]={1,2,3,4,5};//初始化链表,使头结点的next为NULLstruct node* list_init(void) {    struct node *temp;    temp = (struct node*)malloc(sizeof(struct node));    temp->next = NULL;    return temp;}//从链表后面加入一个新结点void list_add(struct node *L,struct node *new) {    struct node *temp = L;    while (temp->next != NULL) {        temp = temp-> next;    }    temp->next = new;}//将数组的元素放在链表中来void list_create(struct node *L) {    struct node *temp;    int i;    for(i=0;i<5;i++) {        temp = (struct node*)malloc(sizeof(struct node));        temp->data=str[i];        temp->next=NULL;        list_add(L,temp);    }}//判断链表是否为空,即头点的next是否为NULLint list_isempty(struct node *L) {    return L->next == NULL;}//判断某个结点是否为尾结点int list_islast(struct node *p,struct node *L) {    return p->next ==NULL;}//找到第一个元素值为x的结点的前驱struct node* list_find(int x,struct node *L) {    struct node *temp = L;    while (temp->next !=NULL && temp->next->data != x) {        temp = temp ->next;    }    return temp;};//删除某个元素值为x的结点void list_delete(int x,struct node *L) {    struct node *temp,*p;    p = list_find(x,L);    temp = p->next;    p->next = temp->next;    free(temp);}//输出链表void list_dump(struct node *L){    struct node *p = L->next;    while (p) {        printf("%d ", p->data);        p = p->next;    }    printf("\n");}//插入值为x的结点,p为插入成功后 元素值为x的结点 的前驱void list_insert(int x,struct node *p,struct node *L) {    struct node *new;    new = (struct node *)malloc(sizeof(struct node));    new->data = x;    new->next = p->next;    p->next = new;}//删除整个链表(头结点依然保存,相当于清空数据结点)void list_deletelist(struct node *L) {    struct node *temp,*p;    p = L ->next;    L->next = NULL;    while(p) {        temp = p->next;        free(p);        p = temp;    }}int main(){    struct node *L,*temp;    L=list_init();    list_create(L);    printf("初始化创建链表结果:\n");    list_dump(L);    list_delete(3,L);    printf("删除第一个元素值为3的结点:\n");    list_dump(L);    temp = list_find(4,L);    list_insert(3,temp,L);    printf("数值4前面插入数值3:\n");    list_dump(L);    list_deletelist(L);    printf("删除整个链表后的结果:\n");    list_dump(L);    return 0;}

运行结果如下:

0 0