1 结构体定义
//定义data成员的类型
typedef int ElementType;
//定义单链表节点类型
typedef struct LNode
{
ElementType data;
struct LNode *next;
}LinkList;
2 动作
// 初始化单链表(创建头节点)
LinkList* InitList(LinkList *&L);
//获取单链表长度(长度不包括头节点)
int ListLength(LinkList *L);
bool isListEmpty(LinkList *L);
// 清空单链表 ,L->next=NULL
void ClearList(LinkList *&L);
//尾插法从数组中插入节点到单链表
LinkList* ToilInsert(LinkList *&L,ElementType e[],int n);
//遍历单链表
void DispList(LinkList *L);
//返回给定元素值对应节点的下标位置
int LinkListLocate(LinkList *L,ElementType x);
//返回指定下标的链表节点元素值
ElementType elementAt(LinkList *L,int index);
// 在指定元素值x对应的节点后插入元素值为e的节点(头插)
int insertNode(LinkList *&L,ElementType x,ElementType e);
//从键盘输入节点信息,构造单链表(尾插法)
LinkList* LinkListCreate( );
//销毁单链表(包含头节点在内),回收节点空间
void DestList(LinkList *&L);//删除节点之前,存储该节点的后继节点信息
/* 从单链表中删除某给定元素对应的节点 */
void LinkListDel(LinkList *&L,ElementType x);
3 代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct LNode
{
ElementType data;
struct LNode *next;
}LinkList;
LinkList* InitList(LinkList *&L)
{
if(L==NULL)
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
printf("初始化成功!\n");
}
else
printf("已经初始化过了!\n");
return L;
}
bool isListEmpty(LinkList *L)
{
return ListLength(L)>0?0:1;
}
void ClearList(LinkList *&L)
{
if(L!=NULL)
L->next=NULL;
printf("清空成功!\n");
}
int ListLength(LinkList *L)
{
int i=0;
if(L!=NULL)
{
LinkList *p=0;
p=L->next;
while(p!=NULL)
{
i++;
p=p->next;
}
p=0;
free(0);
}
return i;
}
LinkList* ToilInsert(LinkList *&L,ElementType e[],int n)
{
LinkList *s=0,*r=0;
L=InitList(L);
r=L;
for(int i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e[i];
s->next=NULL;
r->next=s;
r=s;
}
r->next=NULL;
s=0;
r=0;
free(0);
return L;
}
void DispList(LinkList *L)
{
if(L!=NULL)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
else
printf("链表为空\n");
printf("\n");
}
int LinkListLocate(LinkList *L,ElementType x)
{
int index=0;
if(L!=NULL)
{
LinkList *p=NULL;
p=L->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
++index;
}
if(p==NULL)
{
printf("未找到符合条件的节点\n");
index=-1;
}
else
{
p=NULL;
}
free(p);
}
else
printf("链表为空\n");
return index;
}
ElementType elementAt(LinkList *L,int index)
{
ElementType e=-1;
if(L!=NULL)
{
LinkList *p=NULL;
p=L;
if(index<0||index>=ListLength(L))
{
e=-1;
}
else
{
for(int i=0;i<=index;i++)
{
p=p->next;
}
e=p->data;
}
p=NULL;
free(p);
}
else
printf("链表为空\n");
return e;
}
void LinkListDel(LinkList *&L,ElementType x)
{
if(L!=NULL)
{
LinkList *pre=0,*p=0;
pre=L;
p=L->next;
while(p!=NULL && p->data!=x)
{
pre=p;
p=p->next;
}
if(p==NULL)
{
printf("表中不存在元素%d\n",x);
exit(0);
}
pre->next=p->next;
pre=0,p=0;
free(0);
}
else
printf("链表为空\n");
}
void DestList(LinkList *&L)
{
if(L!=NULL)
{
LinkList *pre=NULL,*p=NULL;
pre=L;
p=L->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
L=NULL;
pre=NULL;
p=NULL;
free(NULL);
printf("销毁成功!");
}
else
printf("链表为空\n");
}
LinkList* LinkListCreate( )
{
LinkList *L=NULL;
InitList(L);
LinkList *p=NULL,*r=NULL;
ElementType x;
r=L;
printf("please input data,input -1 is end\n");
scanf("%d",&x);
while (x!=-1)
{
p=(LinkList*)malloc(sizeof(LNode));
p->data=x;
r->next=p;
r=p;
scanf("%d",&x);
}
r->next=NULL;
p=0;
r=0;
free(0);
return L;
}
int insertNode(LinkList *&L,ElementType x,ElementType e)
{
if(L!=NULL)
{
LinkList *p=0,*s=0;
p=L->next;
while(p!=NULL && p->data!=x )
{
p=p->next;
}
if(p==NULL)
printf("节点%d不存在",x);
else
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=e;
s->next=p->next;
p->next=s;
}
p=0;
s=0;
free(0);
}
else
printf("链表为空\n");
return 0;
}
void interupt()
{
printf("即将退出...\n.");
exit(0);
}
int menu()
{
int c;
printf("1 初始化单链表\n");
printf("2 清空单链表\n");
printf("3 检查单链表是否为空\n");
printf("4 遍历单链表\n");
printf("5 求单链表的长度\n");
printf("6 查找某位置的元素值\n");
printf("7 查找与给定元素值相同的元素的首次出现位置\n");
printf("8 向单链表中插入元素列表\n");
printf("9 从单链表中删除元素\n");
printf("10 结束程序\n");
printf("11 销毁单链表\n");
printf("12 删除值所在节点\n");
printf("13 在指定元素后插入节点(输入)\n");
scanf("%d",&c);
printf("\n");
return c;
}
int main()
{
if(NULL==0)
printf("y\n");
ElementType e[]={3,7,8,6,2,5,5},x=0,data=0;
int n=sizeof(e)/sizeof(ElementType);
LinkList *L=NULL;
int c=0;
int index=0;
while(1)
{
printf("\n");
c=menu();
switch(c)
{
case 1:
L=InitList(L);
break;
case 2:
ClearList(L);
break;
case 3:
printf("%d\n",isListEmpty(L));
break;
case 4:
printf("单链表包含元素:");
DispList(L);
break;
case 5:
printf("单链表长度为:");
printf("%d\n",ListLength(L));
break;
case 6:
printf("请输入要查找的下标");
scanf("%d",&index);
printf("%d",elementAt(L,index));
printf("\n");
break;
case 7:
printf("请输入要查找的元素");
scanf("%d",&x); printf("%d\n",LinkListLocate(L,x));
break;
case 8:
ToilInsert(L,e,n);
break;
case 9:
printf("请输入要删除的元素值");
scanf("%d",&x);
LinkListDel(L,x);
break;
case 10:
interupt();
break;
case 11:
DestList(L);
break;
case 12:
printf("请输入要删除的元素");
scanf("%d",&x);
LinkListDel(L,x);
break;
case 13:
printf("请输入在哪个值后插入节点,以及要插入节点的值");
scanf("%d %d",&x,&data);
insertNode(L,x,data);
}
}
L=0;
free(0);
return 0;
}