C语言实现数据结构的线性链表,插入和删除函数单独运行的时候都正确,为什么先插入后删除就运行不了?

#include<stdio.h>
#include<string.h>
#include<malloc.h>

int n;

typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;

void init_list(LinkList &L)
{
L = (LinkList)malloc(sizeof(LinkList));
L->next = NULL; //初始化一个空链表
}

void create(LinkList &L)
{
LinkList p, last;
int i;
last = L;
for(i=1; i<=n; i++)
{
printf("请输入第%d个结点:", i);
scanf("%d", &last->data);
p = (LinkList)malloc(sizeof(LinkList));
p->next = NULL;
last->next = p;
last = p;
}
printf("线性链表为:\n");
last = L;
for(i=1; i<=n; i++)
{
printf("%d ", last->data);
last = last->next;
}
printf("\n");
}

int ListInsert_L(LinkList &L, int m, int e)
{//在带头结点的单链线性表L中第m个位置之前插入元素e
printf("\n在某位置之前插入1个元素\n输入插入位置:");
scanf("%d", &m);
printf("输入插入元素:");
scanf("%d", &e);

LinkList p, q;
int j; int k;
p = L;
j = 0;
while(p && j<m-2)
{
p = p->next; ++j; //寻找第m-1个结点
}
if(!p||j>m-1) return 0; //m小于1或者大于表长加1
q = (LinkList)malloc(sizeof(LinkList)); //生成新结点
q->data = e; q->next = p->next; //修改后一指针
p->next = q; //修改前一指针

printf("插入元素后的线性链表为:\n");
for(k=1; k<=n+1; k++)
{
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return 1;
}

int ListDelete_L(LinkList &L, int i, int &x)
{//在带头结点的单链线性表L中,删除第i个结点,并由e返回其值
printf("\n请输入要删除的结点位置:");
scanf("%d", &i);
LinkList p, q;
int j; int k;
p = L;
j = 0;
while(p && j<i-2)
{
p = p->next; ++j;
}
if(!p||j>i-1) return 0;
q = (LinkList)malloc(sizeof(LinkList));
q = p->next;
p->next = q->next;
x = q->data;
printf("删除的元素是:%d\n\n", x);
printf("删除元素后的线性链表为:\n");
for(k=1; k<=n; k++)
{
printf("%d ", L->data);
L = L->next;
}
printf("\n");
return 1;
}

void main()
{
LinkList list;
init_list(list);

printf("请输入结点个数:\n");
scanf("%d", &n);

create(list);

int m; int i; int e; int x;
ListInsert_L(list, m, e);
ListDelete_L(list, i, x);
}

//我只能说,代码逻辑混乱,特别是索引,怎么是从1开始的,与一般逻辑不符(从0开始)
//按照你的意图修改如下,能正常运行了。

#include<iostream>
#include<stdlib.h>
using namespace std;
#define null 0
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
int ListLength(LinkList L) {
int n=0;
struct LNode*q=L;
if(L==NULL)
cout<<"链表为空"<<endl;
while(q!=NULL)
{
q=q->next;
n++;
}
return n;
}
ElemType GetElem(LinkList L,int i)
{
int j=1;
struct LNode*q=L;
while(j<i&&q!=NULL)
{
q=q->next;
j++;
}
if(q!=NULL)
return (q->data);
else
cout<<"位置参数不正确"<<endl;
return 0;
}
void InsertList (LinkList &L,ElemType x,int i)
{
int j=1;
struct LNode*q,*s;
s=new LNode;
s->data=x;
q=L;
if(i==1)
{
s->next=q;
L=s;
}
else
{
while(j<i&&q->next!=NULL)
{
q=q->next;
j++;
}
if(j==i-1)
{
s->next=q->next;
q->next=s;
}
else
cout<<"位置参数不正确"<<endl;
}
}
int DeleteElem(LinkList &L,int i)
{
int j=1;
struct LNode *q=L,*t;
if(i==1)
{
t=q;
L=q->next;
}
else
{
while(j<i-1&&q->next!=NULL)
{
q=q->next;
j++;
}
if(q->next!=NULL&&j==i-1)
{
t->next=q->next;
q->next=t;
}
else
cout<<"位置参数不正确"<<endl;
}
if(t)
delete t;
return 0;
}
void DisplayList(LinkList L)
{
struct LNode*q;
q=L;
cout<<"链表元素: ";
if(q==NULL)
cout<<"链表为空"<<endl;
else
{
while(q!=NULL)
{
cout<<q->data<<" ";
q=q->next;
}
}
cout<<endl;
}
void main()
{
LinkList LA = NULL;
ElemType cs;
int len=0;
InsertList(LA, 'a', 1);
InsertList(LA, 'B', 2);
InsertList(LA, 'C', 3);
cs=GetElem(LA, 3);
len=ListLength(LA);
DisplayList(LA);
}
温馨提示:内容为网友见解,仅供参考
无其他回答

用C语言实现线性表的顺序存储(创建,插入,删除和查找)
if(p1==head)\/\/要删除的结点是头结点 { head=p1->next; } else { p2->next=p1->next; } cout<<"成功删除!!"; } p2=p1; p1=p1->next; } return head;}int save_info(char *filename,STUDENT *head,int flag)\/\/功能:将链表按Binary写入文件末尾\/\/参数:\/\/1.filename文件名,绝对地址\/\/2.hea...

用C语言编写链式存储结构下实现线性表的创建,插入,删除,按值查找
\/\/在la链表中的i位置插入数值e int j=1;

用C语言创建一个空线性表,并完成插入删除等基本操作,可就是不知道怎么...
亲,你用的是顺序表的结构体和初始化,其它用的却是链表的操作,建议多看看数据结构的书。

c语言 链表操作:建立,显示及节点的插入,删除
LNode *next;};typedef LNode *LinkList; \/\/ 另一种定义LinkList的方法 \/\/单链表线性表的基本操作(12个)int InitList(LinkList &L){ \/\/ 操作结果:构造一个空的线性表L L=(LinkList)malloc(sizeof(LNode)); \/\/ 产生头结点,并使L指向此头结点 if(!L) \/\/ 存储分配失败 exit(0);L-...

...删除,插入等方法,JAVA,你回答的问题为什么运行不出结果。
s->data=e;s->next=p->next; \/\/插入L中 p->next=s;return OK;}\/\/ListInsert_L 这是插入的算法 太难打了 就先这么多 链表的特点就是指针 一切操作按指针的算法来就OK了 上面给出的是数据结构C的代码 不能运行 这是理论代码 具体的你自己在琢磨琢磨 ...

用C语言编写一个算法,实现有序链表的插入。链表有序且不允许有重复元素...
如代码所示,c++语言,设带头节点的单链表L是一个递增有序表,试写一个函数,将x插入L中,并使L仍是一个有序表。望采纳!

用C语言编写程序建立链表结构体类型实现链表初始化遍历和插入算法
define telemtype char define ok 1 define error 0 define overflow -1 typedef int status;typedef struct bitnode { telemtype data;struct bitnode *lchild,*rchild;}bitnode,*bitree;void preordertraverse(bitree T){ if(T){ printf("%c ",T->data);preordertraverse(T->lchild);preorder...

2010年计算机二级c语言考试
在顺序存储的线性表中,插入或删除数据元素时需要移动大量的数据元素;(2)线性表的顺序存储结构下,线性表的存储空间不便于扩充;(3)线性表的顺序存储结构不便于对存储空间的动态分配。2、线性链表:线性表的链式存储结构称为线性链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的...

你好,数据结构(C语言)中实现有序链表的插入,删除结点基本操作,及两个有...
void creat(); \/\/建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入void del(); \/\/用于删除结点,用于参赛选手的删除void search(); \/\/参赛选手成绩的查询void print(); \/\/用于输出链表void rank(); \/\/按个人平均成绩从高到低的顺序进行排序void update(); \/\/参赛选手的修改void menu...

C语言中链表与队列有很么区别
C语言中的链表与队列是两种不同的数据结构,各自有着独特的特性和应用场景。链表作为一种数据存储方式,它并不要求数据在内存中的连续存储,而是通过指针来连接每一个数据节点,从而实现数据的动态访问和管理。链表具有高度的灵活性,可以方便地进行数据的插入和删除操作,这对于需要频繁修改数据结构的应用来...

相似回答