单链表完整程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//声明:以下操作尽在带头结点单链表基础上完成实现的
#include "stdafx.h"
#include
#include
#define ElemType int

typedef struct node
{
ElemType elem;
struct node *next;
}LinkList;




LinkList * InitLinkList();//(1)建立一个空链表
LinkList * LoadHeadLL();//(2)单链表头插入加载节点
LinkList * LoadTailLL();//(3)单链表尾部插入加载节点
LinkList *Loc_Num(LinkList *A,int i);//(4)单链表按号定位
LinkList *Loc_Value(LinkList *A,int value);//(5)单链表按值定位
LinkList *Delete(LinkList *A);//(6)对单链表中任何相同的元素仅保留一个节点
LinkList *Insert(LinkList *A,int value,int i);//(7)单链表在指定位置插入数据
LinkList *Cut(LinkList *A,int i);//(8)单链表指定位置删除元素
int Length(LinkList *A);//(9)求单链表的长度
void PrintLinkList(LinkList *A);//(10)单链表输出
void instruction();//菜单函数
int _tmain(int argc, _TCHAR* argv[])
{

LinkList *L,*Loc;
int i,j;
while(1)
{
instruction();
scanf("%d",&i);
switch(i)
{
case 1:L=InitLinkList();
break;
case 2:L=LoadHeadLL();
break;
case 3:L=LoadTailLL();
break;
case 4:printf("您要定位第几个节点?\n");
scanf("%d",&i);
Loc=Loc_Num(L,i);
break;
case 5:printf("您要定位节点的值?\n");
scanf("%d",&i);
Loc=Loc_Num(L,i);
break;
case 6:L=Delete(L);
break;
case 7:printf("您要选择几号?\n");
scanf("%d",&i);
printf("您要插入的数据?\n");
scanf("%d",&j);
L=Insert(L,j,i);
break;
case 8:printf("您要选择几号?\n");
scanf("%d",&i);
L=Cut(L,i);
break;
case 9:i=Length(L);
printf("单链表长度为: %d\n",i);
break;
case 10:PrintLinkList(L);
break;
default:
break;
}

}
getchar();
return 0;
}

//菜单函数
void instruction()
{
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("请选择\n");
}

//(1)初始化建立一个空链表
LinkList * InitLinkList()
{
LinkList *A;
A=(LinkList *)malloc(sizeof(LinkList));
A->elem=-1;
A->next=NULL;
return(A);
}

//(2)单链表头插入加载节点
LinkList * LoadHeadLL()
{
LinkList *P,*Q;
ElemType elem;
Q=InitLinkList();
printf("请您输入要插入的元素\n");
scanf("%d",&elem);
while(elem!=-1)
{
P=InitLinkList();
P->elem=elem;
P->next=Q->next;
Q->next=P;
printf("请您输入要插入的元素\n");
scanf("%d",&elem);
}
if(elem==-1)
printf("你输

入的元素 -1 不合法,现已推出添加节点\n");
return(Q);


}

//(3)单链表未插入加载节点(寻找替罪羊[代替头指针做事]的算法)
LinkList * LoadTailLL()
{
int elem;
LinkList *P,*Q,*r;
r=InitLinkList();
r->elem=-1;
r->next=NULL;
Q=r;
printf("请您输入要插入的元素\n");
scanf("%d",&elem);
while(elem!=-1)
{
P=InitLinkList();
P->elem=elem;
P->next=NULL;
r->next=P;
r=P;
printf("请您输入要插入的元素\n");
scanf("%d",&elem);
}
if(elem==-1)
printf("你输入的元素 -1 不合法,现已推出添加节点\n");
return(Q);

}

//(4)单链表按号定位
LinkList *Loc_Num(LinkList *A,int i)
{
int counter;
LinkList *P;
P=A->next;
for(counter=1;counter{
P=P->next;
}
if(counter==i)
return(P);
else
printf("未找到该元素\n");
return(0);
}


//(5)单链表按值定位
LinkList *Loc_Value(LinkList *A,int value)
{
LinkList *P;
P=A->next;
while(P!=NULL&&P->elem!=value)
{
P->next;
}
return(P);//找不到就返回空指针
}

//(6)对单链表中任何相同的元素仅保留一个节点
LinkList *Delete(LinkList *A)
{
LinkList *P,*T,*pre,*header;//T用于探测新的节点用来与P比较
header=A;
P=A->next;
T=P;
while(P!=NULL)
{
pre=T;
T=T->next;
do
{
while(T!=NULL&&T->elem!=P->elem) //T=NULL说明找到尽头了,T->elem=P->elem说明找到了
{
pre=T;
T=T->next;
}
if(T!=NULL)
{
pre->next=T->next;
free(T);
T=T->next;
}
}while(T!=NULL);//do while 语句当调价为真时继续执行循环
P=P->next;
T=P;//T的每个起点都是从P开始的
}
if(P==NULL)
printf("您的单链表为空链表,不存在重复节点\n");
return(header);

}

//(7)单链表在指定位置插入数据
LinkList *Insert(LinkList *A,int value,int i)
{
LinkList *pre,*newnode,*header;
header=A;
pre=Loc_Num(A,i-1);
if(pre!=NULL)
{
newnode=(LinkList *)malloc(sizeof(LinkList));
newnode->elem=value;
newnode->next=pre->next;
pre->next==newnode;
}
return(header);
}

//(8)单链表指定位置删除元素
LinkList *Cut(LinkList *A,int i)
{
LinkList *pre,*aim,*header;
header=A;
pre=Loc_Num(A,i-1);
if(pre!=NULL)
{
aim=pre->next;
pre->next=aim->next;
free(aim);
aim->next=NULL;
}
return(header);
}


//求单链表的长度
int Length(LinkList *A)
{
int counter;
LinkList *P;
P=A;
for(;P->next!=NULL;counter++)
{
P=P->next;
}//计数器在节点判断不为空后才可以自加1
return(counter);
}


//单链表输出
void PrintLinkList(LinkList *A)
{
LinkList *Link;
int counter=0;
Link=A;
Link=Link->next;
while(Link!=NULL)
{
printf("%d ",Link->elem);
++counter;
if(counter%5==0)
printf("\n");
Link=Link->next;
}
}


相关文档
最新文档