关于网友提出的“ 严重郁闷 线性表的链式表示”问题疑问,本网通过在网上对“ 严重郁闷 线性表的链式表示”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 严重郁闷 线性表的链式表示
描述: /*---------大家运行一下就知道问题了
我还是描述一下问题吧:一、插入操作无法插入到指定位置;二、销毁是我强行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