建立一个单链表,其中插入必须尾插法

img

img

应该如何修改这个代码才能够运行成功,要求如下:建立一个带头结点的单链表,结点的值域为整型数据,要求将用户的数据按尾插入法来建立相应的单链表,我现在非常需要,能不能快速给出解决方法,注意主要要用尾插法来插入

代码运行结果如下:

img

代码修改如下:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Stauts;
#define MAXSIZE 100
typedef int ElemType;
typedef struct LNode 
{
    ElemType data;
    struct LNode* next;
}LNode,*LinkList;

//初始化
LinkList InitList()
{
    LinkList L = (LinkList)malloc(sizeof(LNode)); //修改1,LinkList是指针,sizeof(LinkList)得到的是指针的大小,不是结构体的大小
    L->next = NULL;
    return L;
}
//插入,尾插法
int CreateList(LinkList L,int n)
{
    LNode *r,*p;
    int i;

    r = L;
    for(i=0;i<n;i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
    return OK;
}

//3.删除
Stauts ListDelete(LinkList L,int i,ElemType *e)
{
    //在带头节点的单链表中,删除第i个元素
    LNode *p,*q;
    int j;
    p = L;j=0;
    while(p->next && j<i-1)
    {
        p = p->next;
        ++j;
    }
    if(!p->next || j>i-1) return ERROR;
    q = p->next;
    *e = q->data;
    p->next = q->next;
    free(q);
    return OK;
}

//4.遍历
Stauts TraerseList(LinkList L)
{
    LNode* p= 0;
    if(L ==0) return ERROR;
    p = L->next;
    
    while(p)
    {
        printf("%d",p->data);
        p = p->next;
    }
    return OK;
}

int main()
{
    LinkList L = NULL;
    int i,choose,n;
    ElemType e;
    printf("请输入以下数值,选择你想要的操作:\n");
    printf("1.初始化\n");
    printf("2.插入\n");
    printf("3.删除\n");
    printf("4.遍历\n");
    printf("0.退出\n");
    do 
    {
        printf("请输入你要操作的数字:\n");
        scanf("%d",&choose);
        switch(choose)
        {
        case 1:
            printf("执行初始化操作\n");
            L = InitList();
            printf("初始化成功\n");
            break;
        case 2:
            printf("请输入要插入元素的个数:");
            scanf("%d",&n);
            if(CreateList(L,n))
                printf("插入成功\n");
            else
                printf("插入失败\n");
            
            break;
        case 3:
            printf("请输入要删除元素的位置:");
            scanf("%d",&i);
            if(ListDelete(L,i,&e))
                printf("删除成功\n");
            else
                printf("删除失败\n");
            break;
        case 4:
            TraerseList(L);
            break;
        case 0:
            return 0;
        }
    } while (choose >=0);
    return 0;
}

把代码贴出来,好给你改。

img

文件开头加上一句 #define _CRT_SECURE_NO_WARNING 使用scanf不会提示错误。

Status GreateList_R(LinkList L, int n)
{
    if (L == NULL)  return ERROR;
    LNode *r, *p;
    r = L;
    while (r->next)
        r = p->next;
    p = (LinkList)malloc(sizeof(LNode));
    if (p == NULL)      return ERROR;
    p->data = n;
    p->next = NULL;
    r->next = p;
    return OK
}