#include "stdio.h"
#include "malloc.h"
#define datatype int
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct node
{
datatype data; //链表的数据域
struct node *next; //链表的指针域
} LNode,*LinkList;
LinkList Creat_LinkList1( ) //头插入法建立单链表算法
{
LinkList head;
LNode *s;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
char flag='Y';
while(flag=='Y'||flag=='y'){
s=(LNode *)malloc(sizeof(LNode));
printf("请输入新节点数据:");
scanf("%d",&s->data);
s->next=head->next;
head->next=s;
getchar();
printf("继续输入吗?(Y/N):");
scanf("%c",&flag);
}
return (head->next);
}
/*按序号查找 Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
LNode *Get_LinkList(LinkList L,int i)
{
int j;
LNode *p;
p=L;
j=0;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
/*插入运算 Insert_LinkList(L,i,x)
在单链表L的第i个位置上插入值为x的元素*/
int Insert_LinkList(LinkList L, int i, datatype x)
{
int j=0;
LinkList p=L,s;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
return true;
}
}
/*删除运算:Del_LinkList(L,i)
删除单链表L上的第i个数据结点*/
int Del_LinkList(LinkList L,int i)
{
char e;
int j=0;
LinkList p=L,q;
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
return false;
else
{
q=p->next;
if(q==NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
void print(LinkList L) //输出单链表
{ LNode *p=L;
while(p->next!=NULL)
{ printf("%d\t",p->data); //输出表中非最后一个元素
p=p->next;
}
printf("%d\n",p->data); //输出表中最后一个元素
}
void main()
{
LinkList H;
int i,j,k;
datatype x;
do
{
printf("\n\n\n\n");
printf("\t\t\t 链表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t* 1----建 表 *\n");
printf("\t\t* 2----插 入 *\n");
printf("\t\t* 3----删 除 *\n");
printf("\t\t* 4----查 找 *\n");
printf("\t\t* 5----显 示 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t 请选择菜单项(0-5):");
scanf("%d",&k);getchar();
if (k==1)
H=Creat_LinkList1( ); //用头插入法建立单链表
else if (k==2) //在线性表第i位置处插入值为X的元素
{
printf("\n 请输入插入的位置i和数据X(输入格式:i,X):");
scanf("%d,%d",&i,&x);
j=Insert_LinkList(H,i,x);
}
else if (k==3)
{ printf("\n 请输入要删除元素的位置i:");
scanf("%d",&i);
j=Del_LinkList(H,i);
if (j == 1) printf("删除成功!!");
else printf("删除失败!!");
}
else if (k==4) //查找线性表中元素值为x的位置
{ printf("\n 请输入要查找的序号i:");
scanf("%d",&i);
LNode *p;
p=Get_LinkList(H,i);
if (p!=NULL)
{ print(H);printf("中序号为i的地址是 %d ",p);}
else
printf("链表中无此序号!!\n");
}
else if (k==5) //输出链表
{ printf("\n表的存储顺序为:");
print(H);
}
}while(k!=0);
}
说明:1.这个是鄙人大二期间所学,所以模板很多人都用过,如有雷同,不是偶然。
2.发博客只为了纪念所学所感,于此而已。