有没有C语言高手帮我看看这个程序哪里出错了(构建线性链表,实现对其插入删除的操作)

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*linklist;
//尾插法建立带表头节点的单链线性表
void createlist_l(linklist l,int n)
{
linklist q;
int i;
l=(linklist) malloc (sizeof(LNode));
l->next=0;
q=(linklist)malloc(sizeof(LNode));
printf("请输入结点的数据域\n");
for(i=n;i>0;i--)
{
scanf("%d",&q->data);
q->next=l->next;
l->next=q;
}
}
//在指定位置处插入一个节点
void listInsert_l(linklist l,int i,int e)
{
int j;
linklist p;
linklist q;
q=(linklist)malloc (sizeof(LNode));
p=(linklist)malloc (sizeof(LNode));
p=l;
j=1;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(j>i-1||!p)
printf("插入位置不合理");
else
{ q->data=e;
q->next=p->next;
p->next=q; }
printf("插入后的链表为:\n");
}
void listdelete_l(linklist l,int i)
{
linklist p;
linklist q;
int j;
q=(linklist)malloc(sizeof(LNode));
p=l;
for(j=1;j<i-1,!(p->next);j++)
p=p->next;
if(!p->next||j>i-1)
printf("删除位置不合理");
else
q=p->next;
printf("被删除的元素值是%d",q->data);
p->next=q->next;
free(q);
printf("删除后的链表为\n");
}
void print(linklist l)
{
linklist q;
q=l->next;
while(q!=0)
{
printf("%d,",q->data) ;
q=q->next;
}
}
void main ()
{
linklist l;
int n;
int k,e;
printf("请输入链表的元素个数\n");
scanf("%d",&n);
createlist_l(l, n);
printf("请输入所要插入的结点的位置及其数据域\n");
scanf("%d,%d",&k,&e);
listInsert_l(l, k,e);
print(l);
printf("请输入所要删除的结点的位置\n");
scanf("%d",&k);
listdelete_l(l, k);
print(l);
}

下面是根据你的代码修改的,以后尽量不要用字母“l”(小写的L)作变量,容易跟数字1弄混,且不方便阅读。还有写的时候注意指针的用法,如果你要修改参数,就要用这个变量的指针,此处就为二级指针,因为要传送的形参已经是个指针了。

代码:

#include<stdio.h>

#include<stdlib.h>

typedef struct LNode

{

   int data;

  struct LNode *next;

} LNode,*linklist;

//尾插法建立带表头节点的单链线性表,注意,第一个参数为指向链表指针的指针,是个二级指针

void createlist(linklist *head,int n)

{   

  linklist q=NULL,p=NULL; // p 指向表尾结点;q 指向动态分配的结点,即新建立的结点

  int i; // 循环变量

 

  for(i=n;i>0;i--) 

  {  

  q=(linklist)malloc(sizeof(LNode)); // 动态分配一个结点

  printf("请输入结点的数据域:\n"); // 提醒输入数据

  scanf("%d",&(q->data) ); // 输入结点的数据域

  

  if(*head==NULL) // 链表为空时

  {

   *head=q; // 动态分配的结点地址赋给头结点

  } // end if

  else // 链表不为空时

  {

   p->next=q; // 把动态分配的结点地址赋给表尾的next指针

  } // end else

  p=q; // p 指向新的表尾结点

  }

  p->next = NULL; // 表尾结点的next赋值为空

}

// 链表打印函数。由于打印函数不修改链表,所以参数为指向链表的指针,是个一级指针

void print(linklist head)

{

 if(head==NULL) // 空链表的情况

 {

  printf("The list is empty.\n");

  return ; 

 } // end if

 // 链表不为空时

 linklist q; // 定义循环指针变量

 q=head; // 把 头结点指针赋给 q

 while(q!=0) // 直到链表结束,while才结束

 {

  printf("%d,",q->data); // 打印该结点的数据域

  q=q->next; // q 指向下一个结点

 } // end while

}

//在指定位置处插入一个节点

void listInsert(linklist *head,int i,int e)

{

 int j; // 循环变量

 linklist p;

 linklist q;

 q=(linklist)malloc(sizeof(LNode)); // 动态分配一个结点空间

 if(i==1) // 在表头插入

 {

  q->next = *head;// 新分配的结点的链接成员 next 指向现在的头结点

  q->data = e;

  *head = q; // 把新分配的结点地址赋值给头结点指针

  return ; // 函数结束

 } // end if

 // 不在表头插入的情况

 p=*head;

 j=1; 

 while( ((p->next)!=NULL)&&(j<i-1) ) // 在链表内,寻找插入位置

 {

  p=p->next;

  ++j;

 } // end while

 

 if(j<i-1) // 要插入的位置大于量表元素个数,即不合理

 {

  printf("插入位置不合理\n");

  return ;

 } // end if

 else // 插入位置合理时

 {

  if(p->next==NULL) // 在表尾插入

  {

   p->next = q;

   q->next = NULL;

   q->data = e;

  } // end if

  else // 在表中间插入

  {

   q->next = p->next;

   p->next = q;

   q->data = e;

  } // end else

 } // end else

}

// 删除结点函数。第一个参数为一个二级指针,因为要修改链表。

void listdelete(linklist *head,int i)

{

 if(*head==NULL) // 链表为空时

 {

  printf("The list is empty.NO DELETE!\n");

  

  return ;

 } // end if 

 

 // 链表非空时

 linklist q=NULL;

 if(i==1) // 删除的表头

 {

  q=*head;

  *head = (*head)->next;

  free(q);

  return ;

 } // end if

// 删除的不是表头的情况

 linklist p=NULL;

 int j;

// q=(linklist)malloc(sizeof(LNode));

 p=*head;

 

 for(j=1;(j<i-1)&&(p->next->next!=NULL);) // 循环结束后1)如果删除位置合理,j=i-1。另外,若要删除的是表尾元素,

                                       // 则同时p->next=NULL  2) 若删除位置不合理,则j<i-1,此时,p->next为NULL

 {

  j++;

  p=p->next;

 } // end for

 if(j<i-1) // 删除位置不合理

  printf("删除位置不合理\n");

 else // 要删除元素的位置合理

 {

  if(p->next==NULL) // 要删除的是表尾元素

  {

   q=p->next;

   printf("被删除的元素值是%d.",q->data);

   p->next=NULL; // 表尾的next元素置为空

   free(q); // 释放要删除的元素内存

  } // end if

  

  else // 要删除的是表中间的元素

  {

   q=p->next;

   p->next=q->next; // 以上两句为连接要删除元素的前后两个元素

   printf("被删除的元素值是%d.\n",q->data); // 输出要删除的元素值

   free(q); // 释放要删除元素占用的内存

  } // end else

 } // end else

}

// 主函数

void main ()

{

 linklist head = NULL; // 定义链表指针

 int n; 

 int k,e;

 printf("请输入链表的元素个数\n");

 scanf("%d",&n);

 createlist(&head, n); // 调用建立链表元素

 print(head); // 调用打印链表函数

 

 printf("\n请输入所要插入的结点的位置及其数据域:\n");

 scanf("%d%d",&k,&e);

 listInsert(&head, k,e); // 调用插入元素函数

 

 printf("\n"); // 打印换行,为了输出结果更简明

 printf("插入后的链表为:\n");

 print(head); // 调用打印链表函数

 

 printf("\n请输入所要删除的结点的位置\n");

 scanf("%d",&k);

 listdelete(&head, k); // 调用删除元素函数

 printf("\n删除后的链表为:\n");

 print(head); // 调用打印链表函数

 printf("\n");

 return ; // 主函数结束

}

运行结果:

温馨提示:内容为网友见解,仅供参考
无其他回答

这个程序哪里有问题,我想要做的是用c语言数据结构的方式实现链表的插入...
return 1;}void display(LinkList L){LinkList p=L->next;\/\/定义一个结点指针p指向头结点的下一个结点while(p){ \/\/如果p不为空则循环printf("%d ",p->data);p=p->next;\/\/移动指针p遍历链表}}void main(){LinkList lol;lol = (LinkList)malloc(sizeof(LNode));memset(lol,0,sizeof...

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

c语言 链表操作:建立,显示及节点的插入,删除
先写个头文件,包含链表的各种操作。具体代码如下:ifndef LINKEDLIST_H_INCLUDED define LINKEDLIST_H_INCLUDED \/\/线性表的单链表存储结构 struct LNode { ElemType data;LNode *next;};typedef LNode *LinkList; \/\/ 另一种定义LinkList的方法 \/\/单链表线性表的基本操作(12个)int InitList(LinkList...

用c语言调用实现带头结点的单链表的建立,插入,删除,查找的源代码
直接插入。小于的话,移动有序表后插入 int j= i-1; int x = a[i]; \/\/复制为哨兵,即存储待排序元素 a[i] = a[i-1]; \/\/先后移一个元素 while(x < a[j]){ \/\/查找在有序表的插入位置 a[j+1] = a[j]; j--; \/\/元素后移 } ...

...C语言程序,内容是建立一个链表,还有链表的插入与删除。
int listdelete(linklist &l,int i)\/\/在带头节点的单链表中删除第i个元素e,并返回其值 { int j=0;linklist p;p=new lnode;p=l;while(p->next&&jnext;++j;} if(!(p->next)||j>i-1){return 0;} linklist q;q=new lnode;q=p->next;p->next=q->next;m=q->data;free(q...

用C语言实现线性表的顺序存储(创建,插入,删除和查找)
cout<<"成功删除!!"; } p2=p1; p1=p1->next; } return head;}int save_info(char *filename,STUDENT *head,int flag)\/\/功能:将链表按Binary写入文件末尾\/\/参数:\/\/1.filename文件名,绝对地址\/\/2.head指向链表的头结点\/\/3.flag 0追加或1覆盖数据\/\/返回值:失败则返回0{ system("cls"); FILE *fp...

如何用C语言创建一个链表,实现增、删、改、查?
\/\/1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:NODE *creat_link(int direction){ NODE *head,*p,*tail;int xh,i=1;if(direction==1) \/\/当direction的值为1时,新建立的结点连到尾部 { tail=head=(NODE *)malloc(sizeof(NODE));h...

C语言单链表创建和排序问题代码问题,我运行时老是程序错误,不知道...
1、首先说说你的命名问题,不说其他的,在你的工程中,至少要统一化,比如这个函数命名,要么都是小写,要么都是开头大写,这样更让人容易理解。2、关于英文的问题,推荐你一个软件,有道翻译,我都是边写边查找翻译的。3、关于冒泡排序的问题,你可以在看看在百度百科上的例子。我其实不太习惯官方的...

在C语言环境中补充下列程序,完成线性单链表的初始化,插入,删除...
链表实例,一看全懂。(包括初始化,插入,删除等全套)

用C语言编写程序建立链表结构体类型实现链表初始化遍历和插入算法
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);preordertraverse(T->rchild);}...

相似回答