#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;
}
在这一个代码中,发现删除节点有问题。运行结果如下:
于是我就将删除函数,单独写了出来,发现结果没有问题。代码和结果如下:
#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;
}
个人猜测有可能是插入函数写错,但未能找到错误。