m0_61730560 2022-08-07 16:43 采纳率: 100%
浏览 52
已结题

C语言 对链表的基本操作

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode{
struct Lnode *next;
ElemType date;
}Lnode,*LinkList;
void InitList(LinkList *l)//单链表的初始化。
{
l=(Lnode)malloc(sizeof(Lnode));
(*l )->next=NULL;
if(*l) printf("头节点,创建成功!\n");
else printf("头节点,创建失败!\n");
}
void CreatList(LinkList *l)//创建单链表
{
Lnode *head,*p;
int i;
head=l;//head指针=头节点
printf("请输入一共多少个节点:");
scanf("%d",&i);
printf("请分别输入它们的数值:");
for(;i>0;i--){
p=(Lnode
)malloc(sizeof(Lnode));
scanf("%d",&p->date);
p->next=head->next;
head->next=p;//头插法
}
}
void EmptyList(LinkList l)//判断是否为空表
{
if(l->next) printf("L不是空表\n");
else printf("L为空表\n");
}
int ListLength(LinkList l)//求单链表的表长
{
int i=0;
Lnode *p;
p=l->next;
while(p){
p=p->next;
i++;
}
return i;
}
int GetList(LinkList l,int i,ElemType *e)//取链表第i个位置上的值
{
Lnode *p;
p=l;
while(p&&i>0){
p=p->next;
i--;
}
if(i<0||!p) return -1;
else *e=p->date;
return 1;
}
int LocateList(LinkList l,ElemType e)//按值查找
{
int i=1;
Lnode *p;
p=l->next;
while(p&&p->date!=e){
p=p->next;
i++;
}
if(!p) return -1;
else return i;
}
int ListInsert(LinkList *l,int i,ElemType e)//在i位置上插入元素e
{
int j=i-1;
Lnode *head,*p,q;
q=(Lnode
)malloc(sizeof(Lnode));
q->date=e;
head=*l;
p=head;
while(p&&j>0){
p=p->next;
j--;
}
if(!p||i<1) return -1;
else{
q->next=p->next;
p->next=q;
free(q);
}
}
int ListDelete(LinkList *l,int i,ElemType *e)//在i位置上删除元素e
{
int j=i-1;
Lnode *head,*p,*q;
head=*l;
p=head;
while(p&&j>0){
p=p->next;
j--;
}
if(!p||i<1) return -1;
else{
q=p->next;
p->next=q->next;
*e=q->date;
free(q);//释放删除的空间
}
}
void ClearList(LinkList *l)//清空链表
{
Lnode *p,*q,*head;
head=*l;
p=head->next;
while(p){
q=p->next;
free(p);
p=q;
}
head->next=NULL;
}
void DestroyList(LinkList *l)//销毁链表
{
Lnode *p,*head;
head=*l;
while(head){
p=head;
head=head->next;
free(p);
}

}
int main()
{
LinkList L;//头节点
int i,j,k;
ElemType e,f,g,h;
InitList(&L);
CreatList(&L);
EmptyList(L);
printf("单链表的表长为:%d\n",ListLength(L));//长度从首元节点开始算,未计算头节点
printf("请输入要查找的位置:");
scanf("%d",&i);
if(GetList(L,i,&e)==-1) printf("查找位置非法,查找失败!\n");
else printf("查找成功,值为%d\n",e);
printf("请输入要查找的值:");
scanf("%d",&f);
if(LocateList(L,f)==-1) printf("要查找的值不存在。\n");
else printf("%d在链表中的位置是%d\n",f,LocateList(L,f));
printf("请分别输入要插入的位置和要插入的值:");
scanf("%d,%d",&j,&g);
if(ListInsert(&L,j,g)==-1) printf("插入的位置非法,插入错误!\n");
else printf("插入成功。\n");
printf("请输入要删除节点的位置:");
scanf("%d",&k);
if(ListDelete(&L,k,&h)==-1) printf("删除位置非法,删除失败!\n");
else printf("删除成功,%d位置的值为%d。\n",k,h);
printf("请输入要删除节点的位置:");
scanf("%d",&k);
if(ListDelete(&L,k,&h)==-1) printf("删除位置非法,删除失败!\n");
else printf("删除成功,%d位置的值为%d。\n",k,h);
return 0;
}
在这一个代码中,发现删除节点有问题。运行结果如下:

img


于是我就将删除函数,单独写了出来,发现结果没有问题。代码和结果如下:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Lnode{
struct Lnode *next;
ElemType date;
}Lnode,*LinkList;
void InitList(LinkList *l)//单链表的初始化。
{
l=(Lnode)malloc(sizeof(Lnode));
(*l )->next=NULL;
if(*l) printf("头节点,创建成功!\n");
else printf("头节点,创建失败!\n");
}
void CreatList(LinkList *l)//创建单链表
{
Lnode *head,*p;
int i;
head=l;//head指针=头节点
printf("请输入一共多少个节点:");
scanf("%d",&i);
printf("请分别输入它们的数值:");
for(;i>0;i--){
p=(Lnode
)malloc(sizeof(Lnode));
scanf("%d",&p->date);
p->next=head->next;
head->next=p;//头插法
}
}
int ListDelete(LinkList *l,int i,ElemType *e)//在i位置上删除元素e
{
int j=i-1;
Lnode *head,*p,*q;
head=*l;
p=head;
while(p&&j>0){
p=p->next;
j--;
}
if(!p||i<1) return -1;
else{
q=p->next;
p->next=q->next;
*e=q->date;
free(q);//释放删除的空间
}
}
int main()
{
LinkList L;//头节点
int i;
ElemType e;
InitList(&L);
CreatList(&L);
printf("请输入要删除节点的位置:");
scanf("%d",&i);
if(ListDelete(&L,i,&e)==-1) printf("删除位置非法,删除失败!\n");
else printf("删除成功,%d位置的值为%d。\n",i,e);
return 0;
}

img


个人猜测有可能是插入函数写错,但未能找到错误。

  • 写回答

2条回答 默认 最新

  • HTRE 2022-08-07 18:34
    关注

    插入函数中的
    free(p)删除
    因为p节点是要插入到链表当中的,所以不能释放p节点的空间。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 已采纳回答 8月7日
  • 修改了问题 8月7日
  • 修改了问题 8月7日
  • 展开全部

悬赏问题

  • ¥20 全书网Java爬取数据
  • ¥15 SAP HANA SQL Script 。SUM OVER 怎么加where
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥60 为什么使用python对地震数据进行umap降维后,数据成图会出现不连续的现象
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
  • ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
  • ¥15 安卓qpython向ksweb服务器post文件失败