您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 严重郁闷 线性表的链式表示

严重郁闷 线性表的链式表示

来源:网络整理     时间:2016/8/9 13:21:56     关键词:

关于网友提出的“ 严重郁闷 线性表的链式表示”问题疑问,本网通过在网上对“ 严重郁闷 线性表的链式表示”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 严重郁闷 线性表的链式表示
描述:

/*---------大家运行一下就知道问题了
我还是描述一下问题吧:一、插入操作无法插入到指定位置;二、销毁是我强行L->next = NULL
实现的 如果没这句就无法销毁
现在插入后再显示数据也只能显示一个数据!郁闷啊
注意:我是用WIN-tc编译成功的---------------*/
#include "alloc.h"
#include "stdio.h"
#define OK 1
#define ERROR 0
typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
}LNode,*LinkList;
/*----³初始化¯-------*/
int InitLinkList(LinkList L)
{
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    return OK;
}
/*-----½建立表´±í-------*/
int CreateList(LinkList L,int n)
{
    /*建立n结点的表¸öÔªËØ*/
    LinkList p;
    int i;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for(i = n;i > 0;-- i)
    {
        p = (LinkList)malloc(sizeof(LNode));
        printf("Input data:");
        scanf("%d",&(p->data));
        p->next = L->next;
        L->next = p;
    }
    printf("Finished create!\n");
    return OK;
}
/*-------²插入-------*/
int ListInsert(LinkList L,int i,int data)
{
    /*µ第i个元素前插入*/
    LinkList p = L;
    LinkList s;
    int j = 0;
    /*if(p && j < (i - 1))
        printf("Grrrrrrrrrrrrr"); */
    while(p && j < (i - 1))
    {
        p = p->next;
        ++ j;
    }
    if(p || j > (i - 1))
    {
        printf("Error!\n");
        return ERROR;
    }
    s = (LinkList)malloc(sizeof(LNode));
    s->data = data;
    s->next = p->next;
    p->next = s;
    return OK;
}
/*------删除³ý-------*/
int ListDelete(LinkList L,int i,int *e)
{
    /*删除第i个元素*/
    LinkList p = L,q;
    int j = 0;
    while(p->next && j < i - 1)
    {
        p = p->next;
        ++ j;
    }
    if(! (p->next) || j > i - 1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}
/*------显示¾--------*/
void ListDisplay(LinkList L)
{
    LinkList p = L->next;
    while(p)
    {
        printf("data:%d\n",p->data);
        p = p->next;
    }
}
/*--------销毁ö------*/
int ListDestroy(LinkList L)
{
    LinkList temp = L;
    do
    {
        L = temp;
        temp = L->next;
        free(L);
    }while(temp);
    printf("\nList has been destroyed!\n");
    return OK;
}
/*-------main-------*/
main()
{
    int n;
    int ins_data,del_node,save_del,ins_pos;
    LinkList L = NULL;
    InitLinkList(L); 
    printf("Initialization finished!\n");
    printf("Create n nodes list,input n:");
    scanf("%d",&n);
    CreateList(L,n); /**/
    ListDisplay(L);
    printf("Insert data:");
    scanf("%d",&ins_data);
    printf("Insert position:");
    scanf("%d",&ins_pos);
    ListInsert(L,ins_pos,ins_data);/**/
    ListDisplay(L);
    printf("Delete Lnode:");
    scanf("%d",&del_node);
    ListDelete(L,del_node,&save_del); /**/
    printf("data %d has been delete!\n",save_del);
    ListDisplay(L);
    ListDestroy(L);  /**/
    L->next = NULL;
    ListDisplay(L);
    getch();
}


解决方案1:

修改意见~~
#include 
#include "stdio.h"
#define OK 1
#define ERROR 0
typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
}LNode,*LinkList;
/*----³初始化¯-------*/
int InitLinkList(LinkList &L)
{//修改之处,传引用参数
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    return OK;
}
/*-----½建立表´±í-------*/
int CreateList(LinkList &L,int n)
{//修改之处,传引用参数
    /*建立n结点的表¸öÔªËØ*/
    LinkList p;
    int i;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for(i = n;i > 0;-- i)
    {
        p = (LinkList)malloc(sizeof(LNode));
        printf("Input data:");
        scanf("%d",&(p->data));
        p->next = L->next;
        L->next = p;
    }
    printf("Finished create!\n");
    return OK;
}
/*-------²插入-------*/
int ListInsert(LinkList L,int i,int data)
{
    /*µ第i个元素前插入*/
    LinkList p = L;
    LinkList s;
    int j = 0;
    /*if(p && j < (i - 1))
        printf("Grrrrrrrrrrrrr"); */
    while(p && j < (i - 1))
    {
        p = p->next;
        ++ j;
    }
    if(!p || j > (i - 1))
    {///修改,p改成 !p
        printf("Error!\n");
        return ERROR;
    }
    s = (LinkList)malloc(sizeof(LNode));
    s->data = data;
    s->next = p->next;
    p->next = s;
    return OK;
}
/*------删除³ý-------*/
int ListDelete(LinkList L,int i,int *e)
{
    /*删除第i个元素*/
    LinkList p = L,q;
    int j = 0;
    while(p->next && j < i - 1)
    {
        p = p->next;
        ++ j;
    }
    if(! (p->next) || j > i - 1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}
/*------显示¾--------*/
void ListDisplay(LinkList L)
{
    LinkList p = L->next;
    while(p)
    {
        printf("data:%d\n",p->data);
        p = p->next;
    }
}
/*--------销毁ö------*/
int ListDestroy(LinkList L)
{
    LinkList temp = L;
    do
    {
        L = temp;
        temp = L->next;
        free(L);
    }while(temp);
    printf("\nList has been destroyed!\n");
    return OK;
}
/*-------main-------*/
main()
{
    int n;
    int ins_data,del_node,save_del,ins_pos;
    LinkList L = NULL;
    InitLinkList(L); 
    printf("Initialization finished!\n");
    printf("Create n nodes list,input n:");
    scanf("%d",&n);
    CreateList(L,n); /**/
    ListDisplay(L);
    printf("Insert data:");
    scanf("%d",&ins_data);
    printf("Insert position:");
    scanf("%d",&ins_pos);
    ListInsert(L,ins_pos,ins_data);/**/
    ListDisplay(L);
    printf("Delete Lnode:");
    scanf("%d",&del_node);
    ListDelete(L,del_node,&save_del); /**/
    printf("data %d has been delete!\n",save_del);
    ListDisplay(L);
    ListDestroy(L);  /**/
    L->next = NULL;
    ListDisplay(L);
  //  getch();
}

解决方案2:

#include "stdio.h"
#include 
#include 
#define OK 1
#define ERROR 0
typedef struct LinkNode
{
    int data;
    struct LinkNode *next;
}LNode,*LinkList;
/*----³初始化¯-------*/
int InitLinkList(LinkList *L)
{
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    return OK;
}
/*-----½建立表´±í-------*/
int CreateList(LinkList *L,int n)
{
    /*建立n结点的表¸öÔªËØ*/
    LinkList p;
    int i;
    (*L) = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    for(i = n;i > 0;-- i)
    {
        p = (LinkList)malloc(sizeof(LNode));
        printf("Input data:");
        scanf("%d",&(p->data));
        p->next = (*L)->next;
        (*L)->next = p;
    }
    printf("Finished create!\n");
    return OK;
}
/*-------²插入-------*/
int ListInsert(LinkList *L,int i,int data)
{
    /*µ第i个元素前插入*/
    LinkList p = *L;
    LinkList s;
    int j = 0;
    /*if(p && j < (i - 1))
        printf("Grrrrrrrrrrrrr"); */
    while(p && j < (i - 1))
    {
        p = p->next;
        ++ j;
    }
    if(p || j > (i - 1))
    {
        printf("Error!\n");
        return ERROR;
    }
    s = (LinkList)malloc(sizeof(LNode));
    s->data = data;
    s->next = p->next;
    p->next = s;
    return OK;
}
/*------删除³ý-------*/
int ListDelete(LinkList *L,int i,int *e)
{
    /*删除第i个元素*/
    LinkList p = *L,q;
    int j = 0;
    while(p->next && j < i - 1)
    {
        p = p->next;
        ++ j;
    }
    if(! (p->next) || j > i - 1)
        return ERROR;
    q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}
/*------显示¾--------*/
void ListDisplay(LinkList L)
{
    LinkList p = L->next;
    while(p)
    {
        printf("data:%d\n",p->data);
        p = p->next;
    }
}
/*--------销毁ö------*/
int ListDestroy(LinkList *L)
{
    LinkList temp = *L;
    do
    {
        *L = temp;
        temp = (*L)->next;
        free(*L);
    }while(temp);
    printf("\nList has been destroyed!\n");
    return OK;
}
/*-------main-------*/
int main()
{
    int n;
    int ins_data,del_node,save_del,ins_pos;
    LinkList L = NULL;
    InitLinkList(&L); 
    printf("Initialization finished!\n");
    printf("Create n nodes list,input n:");
    scanf("%d",&n);
    CreateList(&L,n); /**/
    ListDisplay(L);
    printf("Insert data:");
    scanf("%d",&ins_data);
    printf("Insert position:");
    scanf("%d",&ins_pos);
    ListInsert(&L,ins_pos,ins_data);/**/
    ListDisplay(L);
    printf("Delete Lnode:");
    scanf("%d",&del_node);
    ListDelete(&L,del_node,&save_del); /**/
    printf("data %d has been delete!\n",save_del);
    ListDisplay(L);
    ListDestroy(&L);  /**/
    L->next = NULL;
    ListDisplay(L);
    getch();
    return 0;
}
把那些会改变L的函数全都改成传递二级指针!
这样才能使对指针做的修改得以保存!因为你的做法是传值的.(对指针本身而言)


以上介绍了“ 严重郁闷 线性表的链式表示”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3156932.html

相关图片

相关文章