链表(LinkedList) C 语言实现

来源:互联网 发布:淘宝网店托管靠谱 编辑:程序博客网 时间:2024/04/25 14:24

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。如图:



上图还给出这样一层含义,链表中的各节点在内存的存储地址不是连续的,其各节点的地址是在需要时向系统申请分配的,系统根据内存的当前情况,既可以连续分配地址,也可以跳跃式分配地址。


单向链表程序的实现:

#include <stdio.h>#include <stdlib.h>struct student {    int score;    struct student *next;};typedef struct student NODE; //typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。简化一些比较复杂的类型声明。NODE *create(); //创建链表void insert(NODE *head, NODE *pnew, int i); //插入void delete(NODE *head, int i); //删除void allClear(NODE *head); //清除链表的所有节点,包含头节点。void display(NODE *head); //打印链表int main(int argc, const char * argv[]) {    NODE *head, *pnew;        //创建链表    head = create();        //打印链表    display(head);        //插入一个新节点    pnew = (NODE*)malloc(sizeof(NODE));    pnew->score = 99;    insert(head, pnew, 1);        //打印链表    display(head);        //删除    delete(head, 0);        //打印链表    display(head);        //清除链表的所有节点,包含头节点。    allClear(head);        //打印链表    display(head);        return 0;}//创建链表NODE *create() {    NODE *head, *tail, *pnew;    int score;    head = (NODE*)malloc(sizeof(NODE)); //创建头节点。    if (head == NULL) {        printf("创建失败!");        return NULL;    }    head->next = NULL;    tail = head;    printf("输入学生成绩:");    while (1) {        scanf("%d", &score);        if (score < 0) //成绩为负是退出循环            break;        pnew = (NODE*)malloc(sizeof(NODE)); //创建新节点        if (pnew == NULL) {            printf("创建失败!");            return  NULL;        }        pnew->score = score;        pnew->next = NULL;        tail->next = pnew; //新节点插入到表尾        tail = pnew; //为指针指向当前的尾节点    }    printf("返回头节点");    return head;}//插入 头结点不算,从有数据的开始算第一个void insert(NODE *head, NODE *pnew, int i) {    NODE *p = head;    int j;    for (j = 0; j < i && p != NULL; j++) {        p = p->next;        if (p == NULL) {            printf("\n与插入的节点不存在!");            return;        }    }    pnew->next = p->next;    p->next = pnew;}//删除 头结点不算,从有数据的开始算第一个void delete(NODE *head, int i) {    NODE *p = head, *pnew;    int j;    for (j = 0; j < i && p != NULL; j++) {        p = p->next;        if (p == NULL) {            printf("\n删除的节点不存在!");            return;        }    }    pnew = p->next;    p->next = pnew->next;    free(pnew);}//清除链表的所有节点,包含头节点。void allClear(NODE *head) {    NODE *p, *q;    p = head;    while (p->next != NULL) {        q = p->next;        p->next = q->next;        free(q);    }    free(head); //最后删除头节点}//打印链表void display(NODE *head) {    printf("\n学生成绩分别是:");    NODE *p;    for (p = head->next; p != NULL; p = p->next) {        printf("%d ", p->score);    }}




0 0
原创粉丝点击