首页 > 其他 > 详细

老师要我们写单链表基本操作。。。

时间:2019-04-08 19:17:39      阅读:138      评论:0      收藏:0      [点我收藏+]
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE  1
typedef int Datatype;
typedef struct Node{
 Datatype data;
struct Node *next;
}Linklist;
Linklist *InitList(Linklist *L)    //初始化链表
{
 L=(Linklist *)malloc(sizeof(Linklist));
 L->next=NULL;
 return L;
}
void DestroyList(Linklist *L)   //销毁单链表
{
 Linklist *pre=L,*p=L->next;
 while(p!=NULL)
 {
  free(pre);
  pre=p; 
  p=pre->next;
 }
free(pre);
}
int  ListEmpty(Linklist *L)
{
 return (L->next==NULL);
}
 
void Create_LinkF(Linklist *P,Datatype *value,int n)//头插法
{
 Linklist *s;
 int i;
 for(i=0;i<n;i++)
 {
  s=(Linklist *)malloc(sizeof(Linklist));
  s->data=*(value+i);
  s->next=P->next;
  P->next=s;
 }
}
void Create_LinkR(Linklist *p,Datatype *value,int n)//尾插法
{
 Linklist *s;
 // r=p;
 int i;
 for(i=0;i<n;i++)
 {
  s=(Linklist *)malloc(sizeof(Linklist));
  s->data=*(value+i);
  p->next=s;
  p=s;
 }
 p->next=NULL;
 }
 
void DispList(Linklist *L) //显示链表
{
 Linklist *p=L->next;
 while(p!=NULL)
 {
  printf("%d ",p->data);
  p=p->next;
 }
 putchar(10);
}
int ListLength(Linklist *L) //计算链表的长度
{
 int n=0;
 while(L->next!=NULL)
 {
  n++;
  L=L->next;
 }
 return n;
}
int LocateElem(Linklist *L,Datatype e,int *p) //查找某一元素的下标
{
 int i=-1,j=0;
 Linklist *s;
 s=L;
 while(s->next!=NULL)
 {
  s=s->next;
  i++;
 if(s->data==e)
 {
  *p=i;
  p++;
  j++;
 }
 }
return j;
}
int LinklistInsert(Linklist *L,int i,Datatype value) //在指定下标插入元素
{
 Linklist *s;
 s=(Linklist *)malloc(sizeof(Linklist));
 int j=0;
 while(j<i-1&&L!=NULL)
 {
  j++;
  L=L->next;
 }
 if(L==NULL)
 {
  return -1;
 }
 else
 {
  s->data=value;
  s->next=L->next;
  L->next=s;
  return 0;
 }
}
int ListDelete(Linklist *L,int i) //删除指定下标的元素
{
 Linklist *s;
 int j=0;
 while(j<i&&L!=NULL)
 {
  j++;
  L=L->next;
 }
 if(L==NULL)
 {
  return -1;
 } 
 else
 {
  s=L->next;
  if(s==NULL)
   return -1;
  L->next=s->next;
  free(s);
  return 0;
 }
 }
 
int main()
{
 Linklist *L;
 Datatype *a,value;
 int n,i,j,flag=0,*P;
 P=(Datatype *)malloc(sizeof(Datatype));
 a=(Datatype *)malloc(sizeof(Datatype));
 L=InitList(L);
 printf("请输入链表的长度:\n");
 scanf("%d",&n);
 printf("请输入%d个数:\n",n);
 for(i=0;i<n;i++)
 {
  scanf("%d",&value);
  *(a+i)=value;
 }
 printf("请选择 1 头插法建立链表。 2 尾插法建立链表。\n");
 scanf("%d",&flag);
 if(flag==1)
 { Create_LinkF(L,a,n); }
 
 else if(flag==2)
 { Create_LinkR(L,a,n); }
 if(ListEmpty(L)==FALSE)
 {
  printf("该链表为:\n");
  DispList(L);
 }
 else if(ListEmpty(L)==TRUE)
 { printf("该链表为空!\n"); }
 printf("该链表长度=%d\n",ListLength(L));
 
 printf("请输入要查找的数:\n");
 scanf("%d",&value);
 j=LocateElem(L,value,P);
 for(i=0;i<j;i++)
 printf("%d的下标为:%d \n",value,*(P+i));
 
 printf("请输入要插入的位置以及要插入的值:\n");
 scanf("%d",&i);
 scanf("%d",&value);
 LinklistInsert(L,i,value);
 
 printf("执行插入操作之后的链表为:\n");
 DispList(L);
 
 printf("请输入要删除数的下标:\n");
 scanf("%d",&i);
 ListDelete(L,i);
 printf("执行删除操作后的链表:\n");
 DispList(L);
 DestroyList(L);
 return 0;
}

老师要我们写单链表基本操作。。。

原文:https://www.cnblogs.com/erlongi/p/10672684.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!