头文件link.h
typedef struct LNode{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//头插法
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建头结点
L->next=NULL;
scanf("%d",&x); //输入结点的值
while(x!=9999) //下面这段一直插入结点,知道输入9999结束
{
s=(LNode*)malloc(sizeof(LNode));//创建头结点
s->data=x;
s->next=L->next;
L->next=s; //将新结点插入链表中
scanf("%d",&x);
}
return L;
}
//尾插法
LinkList List_TailInsert(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L; //r为表尾指针
scanf("%d",&x); //输入结点的值
while(x!=9999)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL; //尾结点指针置空
return L;
}
//按序号查找结点值
LNode *GetElem(LinkList L,int i)
{
int j=1; //计数,初始值为1
LNode *p=L->next; // 头结点赋值给指针p
if(i==0)
return L; //若i==0,返回头结点
if(i<1)
return NULL;
while(p&&j<i) //从第一个结点开始查找,查找第i个结点
{
p=p->next;
j++;
}
return p; //返回第i个结点的指针,若i大于表厂则返回NULL
}
//按值查找表结点
LNode *LocateElem(LinkList L,ElemType e)
{
LNode *p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
}
return p;
}
int print(LinkList L)
{
LNode *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}
//插入结点操作
int Insert(LinkList L,int i,ElemType x)
{
LNode *p,*s;
s=(LNode *)malloc(sizeof(LNode));
s->next=NULL;
s->data=x;
p=GetElem(L,i-1); //找到插入位置的前驱结点
s->next=p->next;
p->next=s;
return 1;
}
//删除节点操作
int Delete(LinkList L,int i,ElemType *x)
{
LNode *p,*q;
p=GetElem(L,i-1); //找到删除位置的前驱结点
q=p->next; //q指向被删除的结点
p->next=q->next;
*x=q->data;
free(q);
return 1;
}
//求表长操作
int ListLength(LinkList L)
{
LNode *p=L->next;
int count=0;
while(p!=NULL)
{
count++;
p=p->next;
}
return count;
}
源文件 test.cpp
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
#include"link.h"
int main()
{
int number,x;
LinkList mylist;
// List_HeadInsert(mylist);//调用头插法
List_TailInsert(mylist);//调用尾插法
Insert(mylist,1,100);//插入第一个数据节点
printf("删除之前:"); //注意0号结点是头结点,这里从1开始
print(mylist);
Delete(mylist,1,&x);//删除第一个数据结点
printf("删除之后:");
print(mylist);
printf("被删除的值为:%d\n",x);
int length=ListLength(mylist);
printf("当前单链表的长度为:%d\n",length);
while(1)//循环查询结点序号
{
printf("请输入要查找的序号:");
scanf("%d",&number);
LNode* p=GetElem(mylist,number);
if(p!=NULL)
{
printf("查找成功");
}
else
{
printf("查找失败");
}
}
return 0;
}
运行结果:
注意:这是带头结点的单链表,所以0号节点是头结点,查找0号结点是可以查找成功的。我并没有给0号节点数据域赋值,根据个人情况去做