无问青秋 2023-03-12 12:46 采纳率: 100%
浏览 16
已结题

数据结构链表的创建插入删除操作


#define _CRT_SECURE_NO_WARNINGS
#define ERROR 0
#define OK 1
#include <iostream>
using namespace std;
typedef int Status;
typedef int Elemtype;
typedef struct Lnode//定义链表
{
    Elemtype data;
    struct Lnode *next;
}Lnode,*Linklist;
Status Init(Linklist&L)//初始化
{
    L = new Lnode;//用new为L动态分配空间,空间中有data,*next
    L->next = NULL;
    cout << "\t\t初始化成功!" << endl;
    return OK;
}
Status Createlist(Linklist&L)//初始创建链表
{//尾插法
    int n;
    Lnode *p,*r;//生成结点p和尾指针r
    r = L;
    cout << "输入元素个数:";
    cin >> n;
    cout << "请输入元素:";
    for (int i = 1; i <= n; i++)
    {
        p = new Lnode;//为p分配空间
        cin >> p->data;
        p->next = NULL;
        r->next=p;//r->next本来是NULL,现在把p赋给r->next
        r = p;//r是尾指针,要一直指向尾部
    }
    cout << "初始化创建成功!" << endl;
    return OK;
    /* 前插法
    int n;
    Linklist p;//生成结点p
    cout << "输入元素个数:";
    cin >> n;
    cout << "请输入元素:";
    for (int i = 1; i <= n; i++)
    {
        p = new Lnode;//为p分配空间
        cin >> p->data;
        p->next=L->next;
        L->next = p;
    }*/
}
void Output(Linklist L)
{
    Lnode* tmp = L->next;//!!!
    while (tmp != NULL)
    {
        cout << tmp->data<<" ";
        tmp = tmp->next;
    }
    cout << endl;
}
Status Insert(Linklist& L)
{//在第n个元素前插入
    int n,i=1;
    Lnode* tmp = L;
    cout << "请输入插入的位置:";
    cin >> n;
    //while (tmp->next != NULL && i < n)
    while (tmp && i < n)
    {
        tmp = tmp->next;
        i++;
    }//跳出循环时tmp指向n的前一个
    //if (tmp->next == NULL) 
    if(tmp==NULL){ cout << "位置非法,插入失败!" << endl; return ERROR; }
    Lnode* p;//生成新节点
    p = new Lnode;//分配空间
    cout << "输入要插入的数字:";
    cin >> p->data;
    p->next=tmp->next;
    tmp->next=p;
    cout << "插入成功!" << endl;
    Output(L);
    return OK;
}
Status Getelem(Linklist L)
{
    int n,i=1;
    Lnode* tmp=L;
    cout << "请输入要获取的元素的位置:";
    cin >> n;
    //while (tmp->next != NULL && i < n)//可以循环,判断i==n时直接输出
    while (tmp && i < n)
    {//终止条件是tmp->next为空 或者 i==n
        tmp=tmp->next;
        i++;
    }
    if (tmp == NULL) { cout << "位置非法,插入失败!" << endl; return ERROR; }
    cout << i <<"号位置的元素为" << tmp->data << endl;//此时i==n,直接输出
    cout << "获取元素成功!" << endl;
    return OK;
}
Status Search(Linklist L)
{
    int elem,flag=0,i=1;
    Lnode* tmp=L;
    cout << "请输入要查询的元素:";
    cin >> elem;
    //while (tmp->next != NULL)
    while (tmp)
    {            
        if (tmp->data == elem){
            cout << "该元素的位置为" << i << endl;
            cout << "查找成功!"<<endl;
            flag = 1;
            return OK;}
        tmp = tmp->next;
        i++;
    }
    if (flag == 0)cout << "查询失败" << endl;
}
Status Del(Linklist& L)
{
    Lnode* p = L;
    cout << "请输入删除的元素的位置:";
    int x;
    cin >> x;
    int i = 1;
    while (p->next != NULL && i < x )// || ?
    {
        p = p->next;
        i++;
    }
    if (p->next == NULL) { cout << "位置非法,删除失败!" << endl; return ERROR; }
    Lnode* tmp;//临时存放,以备删除
    tmp=p->next;
    p->next=tmp->next;
    delete tmp;
    cout << "删除成功!" << endl;
    Output(L);
    return OK;
}
void menu(Linklist L)
{
    printf("---------------------------------------\n");
    printf("\t1.清屏\t2.创建\t3.输出\n");
    printf("\t4.插入\t5.删除\t6.取值\n");
    printf("\t7.查找\t0.退出\n");
    printf("---------------------------------------\n");
    int select;
    while(1)
    {    
        cout << "请输入选项:";
        cin >> select;
        switch (select) 
        {
            case 1:system("cls");    break;
            case 2:Createlist(L);    break;
            case 3:Output(L);        break;
            case 4:Insert(L);        break;
            case 5:Del(L);            break;
            case 6:Getelem(L);        break;
            case 7:Search(L);        break;
            case 0:exit(1);            break;
            default:cout << "请重新输入!" << endl;
        }
    }
    
}
int main()
{
    Linklist L;//创建头指针
    Init(L);//初始化  将头指针传入初始化函数初始化
    menu(L);
    return 0;
}

img


我输入的11 22 33,结果33被挤没了,第一个位置是-842150451,检查了output函数和init函数没问题啊,之后在第5个位置插入66后,33才出来,但是插入的66看不到

img


我在第一个位置插入44,结果44成了第二个元素

img


我要删除第一个元素-842150451,结果把第二个44删了,但是查询-842150451的位置就是1
头大,哪里有问题?请指教!!谢谢

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-12 13:43
    关注

    调试下第一个元素的指针指向了哪里

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月19日
  • 创建了问题 3月12日

悬赏问题

  • ¥60 优博讯DT50高通安卓11系统刷完机自动进去fastboot模式
  • ¥15 minist数字识别
  • ¥15 在安装gym库的pygame时遇到问题,不知道如何解决
  • ¥20 uniapp中的webview 使用的是本地的vue页面,在模拟器上显示无法打开
  • ¥15 网上下载的3DMAX模型,不显示贴图怎么办
  • ¥15 关于#stm32#的问题:寻找一块开发版,作为智能化割草机的控制模块和树莓派主板相连,要求:最低可控制 3 个电机(两个驱动电机,1 个割草电机),其次可以与树莓派主板相连电机照片如下:
  • ¥15 Mac(标签-IDE|关键词-File) idea
  • ¥15 潜在扩散模型的Unet特征提取
  • ¥15 iscsi服务无法访问,如何解决?
  • ¥15 感应式传感器制作的感应式讯响器