#define ok 1
#define error -1
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,* LinkList;
//构造空表
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL;//头结点指针域为空,则表为空表
return ok;
}
/*void CreatList(LinkList L,int n)
{
LNode *p;
int i;
L->next=NULL;
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
printf("No.%d:",i);
scanf("%d",&p->data);
p->next=L->next;
L->next=p;//插到表头
}
}*/
void CreatList(LinkList L,int n)
{
LNode *p,*q;
int i=1;
L->next=NULL;//建立一个带头结点的单链表
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
printf("No.%d:",i);
scanf("%d",&p->data);
p->next=q->next;
q->next=p;//新节点插在表尾
q=p;
}
}
void PrintfList(LinkList L)
{
LNode *p;
p=L->next;//初始化,p指向第一个结点
if(p==NULL)
printf("the list is NUll!");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void LengthList(LinkList L)
{
LNode *p;
int count=0;
p=L->next;
while(p!=NULL)
{
count++;
p=p->next;
}
printf("the List length is %d\n",count);
}
void CLearList(LinkList L)//清空链表
{
LNode *p,*q;
/*
p=L->next;
L->next=NULL;
while(p)
{
q=p->next;
free(p);
p=q;
}*/
p=q->next;
while(p){
p=p->next;
free(q);
q=p;
}
}
void DestoryList(LinkList *L)//毁坏链表
{
LNode *p,*q;
p=*L;
*L=NULL;
while(p)
{
q=p->next;
free(p);
p=q;
}
}
Status ListInsert(LinkList L,int i,ElemType e)
{
//单链表的第i个位置插入元素e
LNode *p,*s;
int j=1;
p=L->next;//初始化,p指向第一个结点
if(i<1)return error;//插入位置错
while(p&&j<i-1)
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LNode));
s->next=p->next;//插入到L中
p->next=s;
s->data=e;
return ok;
}
Status DeleteList(LinkList L,int i,ElemType *e){
//删除第i个元素,其值返回e
int j=0;
LNode *p,*q;
p = L;
while(p&&j<i-1)//寻找第i个结点,并令p指向其前驱
{
j++;
p = p->next;
}
if(!p||j>i-1)
return error;//删除位置不合理
q = p->next;// q指向待删除节点
p->next = q->next;//待删除节点的前驱指向待删除节点的后继
e = q->data;// e指向q的数据域
free(q);//释放待删除节点
return ok;
}
Status GetElem(LinkList L,int n,ElemType *e)
{
LNode *p;
int j=1;
if(n<1)
return error;
p=L->next;
while(p&&j<n)
{
p=p->next;
j++;
}
*e=p->data;
//printf("the get number is %d\n",*e);
return ok;
}
#include"stdio.h"
#include"stdlib.h"
#include"LinkList.h"
void main()
{
LinkList L;
int num=1;
if(InitList(&L)==ok)
printf("the LinkList InitList is successful!\n");
//DestoryList(L);
while(num!=0)
{
system("cls");
printf("1.CreatList\t2.PrintfList\t3.LengthList\n");
printf("4.ListInsert\t5.DeleteList\t6.GetElem\t\n");
printf("7.DestoryList\t0.Exit\n");
printf("enter your choose:");
scanf("%d",&num);
switch(num)
{
case 1:
{
int i;
printf("enter the List Length:");
scanf("%d",&i);
CreatList(L,i);
}
break;
case 2:
PrintfList(L);
break;
case 3:
LengthList(L);
break;
case 4:
{
ElemType e;
int i;
printf("enter the position:");
scanf("%d",&i);
printf("enter the number:");
scanf("%d",&e);
if(ListInsert(L,i,e)==ok)
PrintfList(L);
}
break;
case 5:
{
int i;
ElemType e;
printf("enter the Delete Position:");
scanf("%d",&i);
if(DeleteList(L,2,e)==ok)
PrintfList(L);
}
break;
case 6:
{
int i;
ElemType e;
printf("enter the want to get number position:");
scanf("%d",&i);
if(GetElem(L,i,&e)==ok)//get the list number
{
printf("the number is found!\n");
printf("%d \n",e);
}
else
printf("the number is not found!\n");
}
break;
case 7:
DestoryList(&L);
printf("the destory is success!\n");
break;
case 0:
printf("byebye");
break;
default:
break;
}
printf("\n");
system("pause");
}
}