是不是还对单链表无从下手?教你简单的单链表创建(C++)

目录​​​​​​​

1、声明结构体

2、创建链表(尾插法)

3、显示链表

4、插入元素

5、读取表中特点位置的元素

6、清空链表

7、退出程序

整段代码


1、声明结构体

结构体内声明一个存储数据的data;

然后声明一个指针;

typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node LinkList;

2、创建链表(尾插法)

LinkList  * CreateList(int n ,LinkList  *L) {    //尾插法创建链表
    LinkList *p , *r;         //r为节点最终的指针,p为接收的节点
    int i,k ;

    L= (Node * ) malloc(sizeof(Node));//为整个链表
    (L)->next = NULL;

    r= L;          //r为指向尾部的节点
    cout << "请输入数值" << endl;
    for(i = 0 ; i < n; i++ ){
        cout << "输入对应数值" << endl;
        cin >> k;       //输入数值
        p = (Node*) malloc(sizeof(Node));   //生成新节点
        p -> data = k;      //将数值赋值入p
        r->next = p;        //将表尾终端节点的指针指向新节点
        r = p;//将当前的新节点定义为表尾终端节点
        p->Length++;
    }
    //  delete L;
    r -> next = NULL;       //表示当前链表结束

    return L;
}

3、显示链表

void show(LinkList * L) {         //打印整个链表
    LinkList *p = L->next;
    cout << "打印节点" << endl;
    while (p != NULL) {
         cout << p->data << endl;
         p = p->next;
    }
}

4、插入元素

int ListInsert(LinkList *L , int i , ElemType e){   //在L中第i个位置之前插入新的数据元素e ,L的长度加1
    int j;
    LinkList *p , *s;
    p = L;
    j = 1;
    while (p && j < i){     //寻找第i个节点
        p = p -> next;
        ++j;
        p->Length++;
    }
    if(!p || j > i){
        return ERROR;   //第i个元素不存在
    }
    s = (LinkList*) malloc(sizeof(Node));        //生成新节点
    s->data = e;        //将e的数据加入s中
    s->next = p -> next;        //将p的后继赋值给s的后继
    p->next = s;            //将s赋值给p的后继
}

5、读取表中特点位置的元素

int GetElem(LinkList *L , int i, ElemType *e){   //读取单链表中第i个值
    int j;
    LinkList *p;     //声明一节点p
    p = L-> next;  //让p指向L的第一个节点
    j = 1;          //j为计数器
    while (p && j < i){     //p不为空 或者计数器j还没有等于i时,循环继续
        p = p ->next;       //让p指向下一个节点
        ++j;
    }
    if(!p || j > i){        //如果p为空,或者j大于i时,循环结束
        return ERROR;           //i元素不存在
    }
    *e = p->data;           //取第i个元素的数据
    cout << "你要查找的数是" << *e << endl;
    return OK;
}

6、清空链表

 int ClearList(LinkList *L) {     //将L重置为空表
        LinkList *p, *q;
        p = (L)->next;     //*p指向第一个节点
        while (p) {          //没到表尾
            q = p->next;
            free(p);
            p = q;
        }
        (L)->next = NULL;      //头指针指针域为空
        return OK;
    }

7、退出程序

cout << "退出程序" << endl;
      free(L);
      return 0;

整段代码

#include <iostream>
using namespace std;
#include <string>
#include <stdlib.h>
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node LinkList;

int GetElem(LinkList *L , int i, ElemType *e){   //读取单链表中第i个值
    int j;
    LinkList *p;     //声明一节点p
    p = L-> next;  //让p指向L的第一个节点
    j = 1;          //j为计数器
    while (p && j < i){     //p不为空 或者计数器j还没有等于i时,循环继续
        p = p ->next;       //让p指向下一个节点
        ++j;
    }
    if(!p || j > i){        //如果p为空,或者j大于i时,循环结束
        return ERROR;           //i元素不存在
    }
    *e = p->data;           //取第i个元素的数据
    cout << "你要查找的数是" << *e << endl;
    return OK;
}

int ListInsert(LinkList *L , int i , ElemType e){   //在L中第i个位置之前插入新的数据元素e ,L的长度加1
    int j;
    LinkList *p , *s;
    p = L;
    j = 1;
    while (p && j < i){     //寻找第i个节点
        p = p -> next;
        ++j;
        p->Length++;
    }
    if(!p || j > i){
        return ERROR;   //第i个元素不存在
    }
    s = (LinkList*) malloc(sizeof(Node));        //生成新节点
    s->data = e;        //将e的数据加入s中
    s->next = p -> next;        //将p的后继赋值给s的后继
    p->next = s;            //将s赋值给p的后继
}

int DaleteList(LinkList *L , int i , ElemType *e){      //删除第i个元素,L的长度减1
    int j;
    LinkList *p , *q;
    p = L;
    j = 1;
    while(p && j < i){      //寻找第i个节点
        p = p->next;
        ++j;
    }
    if(!p || j > i){
        return ERROR;       //第i个元素不存在
    }
    q = p->next;        //将p的后继赋值给q
    p ->next = p->next->next;   //将q的后继赋值给p的后继,相当于p->next->next
    *e = q->data;           //将d的data赋值给e
    free(q);                //释放节点q

    return OK;
}

LinkList  * CreateList(int n ,LinkList  *L) {    //尾插法创建链表
    LinkList *p , *r;         //r为节点最终的指针,p为接收的节点
    int i,k ;

    L= (Node * ) malloc(sizeof(Node));//为整个链表
    (L)->next = NULL;


    r= L;          //r为指向尾部的节点
    cout << "请输入数值" << endl;
    for(i = 0 ; i < n; i++ ){
        cout << "输入对应数值" << endl;
        cin >> k;       //输入数值
        p = (Node*) malloc(sizeof(Node));   //生成新节点
        p -> data = k;      //将数值赋值入p
        r->next = p;        //将表尾终端节点的指针指向新节点
        r = p;//将当前的新节点定义为表尾终端节点
        p->Length++;
    }
    r -> next = NULL;       //表示当前链表结束

    return L;
}


void show(LinkList * L) {         //打印整个链表
    LinkList *p = L->next;
    cout << "打印节点" << endl;
        while (p != NULL) {
            cout << p->data << endl;
            p = p->next;
    }
}
    int ClearList(LinkList *L) {     //将L重置为空表
        LinkList *p, *q;
        p = (L)->next;     //*p指向第一个节点
        while (p) {          //没到表尾
            q = p->next;
            free(p);
            p = q;
        }
        (L)->next = NULL;      //头指针指针域为空
        return OK;
    }

    int main() {
        LinkList *L;
        int n , i ,e , w , o;

        while(-1) {
            cout << "请选择需要的功能" << endl;
            cout << "1---创建链表" << endl;
            cout << "2---显示链表" << endl;
            cout << "3---插入元素" << endl;
            cout << "4---查询元素" << endl;
            cout << "5---删除元素" << endl;
            cout << "6---清空链表" << endl;
            cout << "7---退出程序" << endl;
            cin >> n;
            switch (n) {
                case 1:
                    cout << "你选择的创建链表" << endl;
                    cout << "需要几个" << endl;
                    cin >> i;
                    L = CreateList(i, L);
                    cout << "链表已建立" << endl;
                    break;
                case 2:
                    cout << "你选择了显示链表" << endl;
                    show(L);
                    cout << "已显示完成" << endl;
                    break;
                case 3:
                    cout << "你选择了修改链表"  << endl;
                    cout << "请输入要插入的元素的位置" << endl;
                    cin >> w;
                    cout << "请输入要插入的元素"  << endl;
                    cin >> e;
                    ListInsert(L , w , e);
                    cout << "修改完成" << endl;
                    break;
                case 4:
                    cout << "你选择了查询元素" << endl;
                    cin >> i;
                    GetElem(L , i, &e);
                    break;
                case 5:
                    cout << "你选择了第 " << i << "删除元素" << endl;
                    cin >> i;
                    DaleteList(L , i , &e);
                    cout << "删除成功" << endl;
                    break;
                case 6:
                    cout << "你选择了清空列表" << endl;
                    cout << "1---请问确定要删除吗" << endl;
                    cout << "2---返回 " << endl;
                    cin>>i;
                    if(i == 1) {
                        ClearList(L);
                        cout << "清空完成" << endl;
                        break;
                    }else{
                        break;
                    }
                case 7:
                    cout << "退出程序" << endl;
                		free(L);
                    return 0;


            }
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/124012678