单链表基本操作的C语言实现(链式存储结构)

来源:互联网 发布:hadoop java获取文件 编辑:程序博客网 时间:2024/06/05 18:39


#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node{    DataType data;    struct Node *next;}List;#define Num 3List* InitList();void CreateListHead(List *l, int n);void CreateListTail(List *l, int n);int Length(List *l);void TraverseList(List *l);int Find(List *l, DataType d);void Insert(List *l, int n, DataType data);void Delete(List *l, int n);void ClearList(List *l);void main(){    int n, pos, input;    List *l;    l = InitList();    /*CreateListHead(l, Num);    printf("线性表的长度是%d\n", Length(l));    TraverseList(l);*/    CreateListTail(l, Num);    printf("线性表的长度是%d\n", Length(l));    TraverseList(l);    //printf("%d %d %d %d\n", l->data, l->next->data, l->next->next->data, l->next->next->next->data);//分别打印各个节点的数据域    printf("请输入要查找的元素:");    scanf_s("%d", &input);    printf("要查找的元素在链表中第%d个位置\n", Find(l, input));        printf("请输入要插入的元素位置和相应数据:");    scanf_s("%d%d", &pos, &input);    Insert(l, pos, input);    printf("线性表的长度是%d\n", Length(l));    TraverseList(l);    printf("请输入要删除的节点下标:");    scanf_s("%d", &n);    Delete(l, n);    printf("线性表的长度是%d\n", Length(l));    TraverseList(l);    ClearList(l);    printf("清空线性表后长度为%d\n", Length(l));    TraverseList(l);}//链表初始化(即分配头结点的内存空间)List* InitList(){    List *l;    l = (List*)malloc(sizeof(List));    if (!l)    {        printf("初始化失败");        exit(1);    }    l->next = NULL;//头结点指针域为空    return l;}//创建带头结点的线性表(头插法)void CreateListHead(List *l, int n){    int i, data;    List *p;    for (i = 0; i < n; i++)    {        p = (List*)malloc(sizeof(List));        printf("请输入数据:\n");        scanf_s("%d", &data);        p->data = data;        p->next = l->next;//确定逻辑关系        l->next = p;    }}//创建带头结点的线性表(尾插法)void CreateListTail(List *l, int n){    int i, data;    List *p,*r = l;    for (i = 0; i < n; i++)    {        p = (List*)malloc(sizeof(List));        printf("请输入数据:\n");        scanf_s("%d", &data);        p->data = data;        //p->next = r->next;        r->next = p;//确定逻辑关系        r = p;    }    r->next = NULL;}//求线性表的长度int Length(List *l){    List *r = l;//不要拿原指针计算    int i = 0;    while (r->next)    {        i++;        r = r->next;    }    return i;}//遍历线性表void TraverseList(List *l){    List *r = l;    printf("链表中的元素依次为:");    while (r->next)    {        r = r->next;        printf("%d ", r->data);    }    printf("\n");}//查询链表中某结点数据是否存在int Find(List *l, DataType d){    int i = 1;    List *r = l;    r = r->next;    while (r && r->data != d)    {        r = r->next;        i++;    }            if (!r)        return 0;    else        return i;}//在链表中插入一个新节点(在第n个节点前插入)void Insert(List *l, int n, DataType data){    int i = 0;    List *p, *r = l;    while (r->next && i < n-1)//寻找第n-1个节点    {        r = r->next;        i++;    }    if (r->next == NULL)        printf("第%d个节点不存在", n);    else    {        p = (List*)malloc(sizeof(List));//确定逻辑关系        p->data = data;        p->next = r->next;        r->next = p;    }}//删除链表中某一节点void Delete(List *l, int n){    int i = 0;    List *s, *r = l;    while (r->next && i < n-1)//寻找第n-1个节点    {        r = r->next;        i++;    }    if (r->next == NULL)        printf("第%d个节点不存在", n);    else    {        s = r->next;//确定待删除节点        r->next = s->next;//确定逻辑关系        free(s);    }}//清空链表(保留头结点,指针域为NULL)void ClearList(List *l){    List *s, *r = l;    while (r->next)    {        s = r->next;        r->next = s->next;//确定逻辑关系        free(s);    }}

原创粉丝点击