数据结构 || 单链表的操作(一)

#include <stdio.h>
#include <malloc.h>
#define OK 1;
#define ERROR 0;

typedef int Status;
typedef int ElemType;
//定义结构体
 struct LNode
{
  ElemType data;
  struct LNode* next;
};
typedef struct LNode* Linklist;
//初始化
Status InitList(LinkList* L)
{
  L=(LinkList)malloc(sizeof(struct LNode));
if(!L)
  {
  printf("初始化失败!");
  }
   L->next=NULL;
  return OK;
}
//取值
Status GetElem(LinkList L,int i,ElemType * e)
{
  LinkList p;
  int j=1;
  p=L->next;
  while(p&&j<i)
  {
    p=p->next;
    j++;
  }
  *e=p->data;
  return OK;
}
//查找
int  LocateElem(LinkList L,ElemType e)
{
  LinkList p;
  int j=1;
  p=L->next;
  while(p&&p->data!=e)
  {
    p=p->next;
    j++;
  } 
  if(!p) return ERROR;
  return j;
}
//插入
Status ListInsert(LinkList* L,int i,ElemType e)
{
  LinkList p,q;
  int j=1;
  p=(*L)->next;
  while(p&&j<i-1)
  {
    p=p->next;
    j++;
  }
  if(!p||j>i-1) return ERROR;
  q=(LinkList)malloc(sizeof(struct LNode));
  q->data=e;
  q->next=p->next;
  p->next=q;
  return OK;
}
//删除
Status DleteleList(LinkList* L,int i,ElemType *e)
{
 LinkList p,q;
 int j=1;
 p=(*L)->next;
 while(p&&j<i-1)
 {
   p=p->next;
   j++;
 }
 if(!p->next||j>i-1) return ERROR;
 q=p->next;
 p->next=q->next;
 *e=q->data;
 free(q);
 return OK;
}
//头插法
void CreateList_F(LinkList* L,int n)
{
LinkList p;
int i;
*L=(LinkList)malloc(sizeof(struct LNode));
(*L)->next=NULL;

  for(i=n;i>0;i--)
  {  
   p=(LinkList)malloc(sizeof(sturct LNode));
   scanf("%d",&p->data);
   p->next=(*L)->next;
   (*L)->next=p;
  }
}
//尾插法
void CreateList_L(LinkList * L,int n)
{
  LinkList p,q;
  *L=(LinkList)malloc(sizeof(struct LNode));
  q=*L;
  for(i=1;i<=n;i++)
  {
   p=(LinkList)malloc(sizeof(struct LNode));
   scanf("%d",&p->data);
  q->next=p;
  q=q->next;
}
p->next=NULL;
}
Status ListTraverse_L(LinkList L,void(*ptr)(ElemType))
{
   LinkList p;
   p=L->next;
   while(p)
   {
     ptr(p->data);
     p=p->next;
   }
   printf("\n");
   return 0;
}

void visit(ElemType c)
{
  printf("%d",c);
}

void main()
{
   

LinkList L;
int n,i,j;
ElemType e,e1;
printf("请输入链表的长度:\n");
scanf("%d",&n);
CreateList_L(&L,n);
printf("请输入要查找的元素:\n");
scanf("%d",&e);
printf("该元素的位置:%d\n",LocatElem(&L,e));
printf("请输入要查找的元素:\n");
scanf("%d",&e);
printf("该元素的位置:%d\n",LocatElem(&L,e));
printf("请输入要插入的元素和位置:\n");
scanf("%d %d",&e,&i);
ListInsert(L,i,e);
ListTraverse_L(L,visit);
printf("请输入要插入的元素和位置:\n");
scanf("%d %d",&e1,&j);
ListInsert(L,j,e1);
ListTraverse_L(L,visit);
printf("请输入要删除的元素的值和位置:\n");
scanf("%d %d",&e,&i);
ListDelete(L,i,&e);
printf("新的链表:\n");
ListTraverse_L(L,visit);
}

猜你喜欢

转载自blog.csdn.net/weixin_44594976/article/details/89344572
今日推荐