辛苦整理了一下头插法的流程图:
尾插法稍后再来整理:
下面上传一下代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef int ElemType;
typedef struct LNode
{
ElemType Data;
struct LNode *Next;
}List;
List L;
List *PtrL;
int Length(List *PtrL)
{
List *p = PtrL->Next;
int j=0;
while(p)
{
p=p->Next;
j++;
}
return j;
}
List *FindKth(int K,List *PtrL)
{
List *p = PtrL->Next;
int i=1;
while(p!=NULL && i<K)
{
p=p->Next;
i++;
}
if(i==K)
{
return p;
}
else
{
printf("请输入正确的位置,谢谢!\n");
exit(0);
}
}
int Find(ElemType X,List *PtrL)
{
List *p = PtrL;
int i=0;
while(p!=NULL && p->Data != X)
{
p=p->Next;
i++;
}
if(p==NULL)
{
printf("未找到您所查询的元素,谢谢!\n");
exit(0);
}
else
return i;
}
List *Insert(ElemType X,int i,List *PtrL)
{
List *p,*s;
if(i==1)
{
s=(List *)malloc(sizeof(List));
s->Data=X;
s->Next=PtrL->Next;
PtrL->Next=s;
return PtrL;
}
p=FindKth(i-1,PtrL);
if(p==NULL)
{
printf("the i is illegal");
exit(0);
}
else
{
s=(List *)malloc(sizeof(List));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return PtrL;
}
}
List *Delete(int i,List *PtrL)
{
List *p,*s;
if(i==1)
{
s=PtrL;
if(PtrL!=NULL)
{
PtrL=PtrL->Next;
}
else
{
return NULL;
}
free(s);
return PtrL;
}
printf("i=%d\n",i);
p=FindKth(i-1,PtrL);
printf("p->Next->Data=%d\n",p->Next->Data);
if(p==NULL || p->Next == NULL)
{
printf("i-1 or i is not exist!");
return NULL;
}
else
{
s=p->Next;
p->Next=s->Next;
free(s);
return PtrL;
}
}
List *InitList()
{
List *p = (List *)malloc(sizeof(List));
printf("&p = 0x%x",&p);
if(p == NULL)
{
printf("malloc failure!");
return NULL;
}
p->Next = NULL;
return p;
}
void CreatListHead_WithArray(List * &PtrL,int a[],int n)
{
List *p;
PtrL=(LNode*)malloc(sizeof(LNode));
PtrL->Next=NULL;
int i;
for(i=0;i<n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
p->Data=a[i];
p->Next=PtrL->Next;
PtrL->Next=p;
}
}
void CreatListHead(List * &PtrL)
{
List *p;
PtrL=(List *)malloc(sizeof(List));
if(PtrL==NULL)
{
printf("malloc failure!");
exit(0);
}
PtrL->Next=NULL;
ElemType x;
printf("请输入链表节点的元素,以-1结束!");
scanf("%d",&x);
while(x!=-1)
{
p=(List *)malloc(sizeof(List));
if(p==NULL)
{
printf("malloc failure!");
exit(0);
}
p->Data=x;
p->Next=PtrL->Next;
PtrL->Next=p;
scanf("%d",&x);
}
}
void CreatListTail_WithArray(List * &PtrL,int a[],int n)
{
List *p,*end;
PtrL=(LNode*)malloc(sizeof(LNode));
PtrL->Next=NULL;
end = PtrL;
for(int i=0;i<n;i++)
{
p=(LNode*)malloc(sizeof(LNode));
p->Data=a[i];
end->Next = p;
end=p;
}
end->Next=NULL;
}
void ShowList(List *Ptrl)
{
List *p;
p=Ptrl->Next;
printf("链表元素如下:\n");
while(p!=NULL)
{
printf("%d ",p->Data);
p=p->Next;
}
printf("\n");
}
void main()
{
ElemType x,i;
List *L;
List *L1;
//L=(List*)InitList();
int a[10]={1,2,3,4,5,6,7,8,9,0};
CreatListHead_WithArray(L,a,10);
CreatListTail_WithArray(L1,a,10);
//CreatListHead(L);
ShowList(L);
ShowList(L1);
printf("L->Data=%d\n",L->Data);
printf("L->Next=0x%x\n",L->Next);
printf("L->Next->Data=%d\n",L->Next->Data);
int j =Length(L);
printf("当前链表的长度为:%d\n",j);
printf("请输入查询的位置:");
scanf("%d",&x);
printf("第%d个元素为:%d\n",x,FindKth(x,L)->Data);
printf("请输入查询的元素:");
scanf("%d",&x);
printf("您查找的元素%d在链表中的第%d个位置\n",x,Find(x,L));
printf("请输入要删除节点的位置:");
scanf("%d",&x);
L=(List*)Delete(x,L);
ShowList(L);
printf("请输入要要插入节点的位置和数据:");
scanf("%d%d",&i,&x);
L=(List*)Insert(x,i,L);
ShowList(L);
free(L);
return;
}