单链表基本操作C语言实现

/*
* 单链表的基本操作实现
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
} Node;
typedef struct Node *LinkList;

/*
* @function : 单链表的创建 (头插法)
* @return : void
*/
void CreateListHead(LinkList *L, int n){
    LinkList p;
    int i;
    srand(time(0));
    *L = (LinkList)malloc(sizeof(Node)); //*L 二重指针
    (*L)->next = NULL;
    for(i = 0; i < n; i++){
        p = (LinkList)malloc(sizeof(Node));
        p->data = rand()%100 + 1;
        p->next = (*L)->next;
        (*L)->next = p;
    }
}

/*
* @function : 单链表的创建 (尾插法)
* @return : void
*/
void CreateListTail(LinkList *L, int n){
    LinkList p, r;
    int i;
    srand(time(0));
    *L = (LinkList)malloc(sizeof(Node));
    r = *L;
    for(i = 0; i < n; i++){
        p = (Node *)malloc(sizeof(Node));
        p->data = rand()%100 + 1;
        r->next = p;
        r = p;
    }
    r->next = NULL;
}

/*
* @function : 获取单链表的元素
* @return : bool
* @param :
*/
bool GetElem(LinkList L, int i, ElemType *e){
    int j;
    LinkList p;  //声明节点p
    p = L->next; //让p指向链表L的第一个节点
    j = 1;  //计数器
    while(p && j < i){  //p不空, 计数器j还没有等于时,循环持续
        p = p->next;  //让p指向下一个节点
        ++j;  //计数器增加
    }
    if(!p || j > i){  //节点为空或者 计数器j大于i
        return false;  //该数据不存在
    }
    *e = p->data;  //将要取得数据赋值给e
    return true;  //返回成功
}

/*
* @function : 向链表插入数据e
* @return : bool
*/
bool ListInsert(LinkList *L, int i, ElemType e){
    int j;
    LinkList p, s; //声明两个节点,p是迭代节点用来找到所需要的插入的节点位置,s 用来指向生成新的节点用来存放需要插入的数据
    p = *L;
    j = 1;
    while(p && j < i){ //寻找第i个节点
        p = p->next;
        ++j;
    }
    if(!p || j > i){ //找不到返回false
        return false;
    }
    s = (LinkList)malloc(sizeof(Node)); //生成新的节点
    s->data = e;  //为新的节点赋值为e
    s->next = p->next; // 将p的后继节点的地址赋给snext指针
    p->next = s;  //将p的后继指针指向s节点
    return true;
}

/*
* @function : 删除某个节点的数据
* @return : bool
*/
bool ListDelete(LinkList *L, int i, ElemType *e){
    int j;
    LinkList p, q;
    p = *L;
    j = 1;
    while (p->next && j < i){ //查找要删除节点
        p = p->next;
        ++j;
    }
    if(!(p->next) || j > i)
        return false;
    q = p->next;  //将p的后继节点fa赋值给q
    p->next = q->next; //p->next的后继节点赋值为p->next指针
    *e = q->data; //q->data 赋值给e
    free(q);  //释放需要删除的节点空间
    return true;
}

int GetLength(LinkList L){
    int j = 0;
    LinkList p;
    p = L->next;
    while(p){
        ++j;
        p = p->next;
    }
    return j;
}

/*
* @function : 输出链表中的数据
*/
void Display(LinkList L){
    LinkList p;
    p = L->next;
    while(p){
        printf("%d\t",p->data);
        p = p->next;
    }
    printf("\n");
}

/*
* @function : 清空链表
* @return : bool
*/
bool ClearList(LinkList *L){
    LinkList p, q;
    p = (*L)->next;
    while(p){
        q = p->next;
        free(p);
        p = q;
    }
    (*L)->next = NULL;
    return true;

}
int main(){
    LinkList L;
    int a, b;
    // CreateListHead(&L, 5);
    CreateListTail(&L, 5);
    Display(L);
    printf("LinkList length is : %d\n",GetLength(L));
    GetElem(L, 3, &a);
    printf("get element is :%d\n",a);
    ListInsert(&L, 3, 100);
    printf("insert element:");
    Display(L);
    ListDelete(&L, 3, &b);
    printf("delete element:");
    Display(L);
    if(ClearList(&L)){
        printf("Clear Link OK!\n");
    }else{
        printf("Clear Link ON!\n");
    }
    return 0;
}

这里写图片描述

ps:代码全都加了注释,方便阅读

猜你喜欢

转载自blog.csdn.net/yhflyl/article/details/78743078