单链表 c语言实现

#include 
#include 
#define  MaxLinkSize 50
typedef int ElemType;
//链表的数据结构
typedef struct LinkNode
{
ElemType data;
 struct LinkNode  *next;
}LinkNode,*Link;
//创建带头结点头插法的链表
void CreateHeadLink(Link *L,int n){
 *L=(LinkNode*)malloc(sizeof(LinkNode));
(*L)->next=NULL;
if(!L) exit(0);//申请失败退出程序
 int i;
  Link p=NULL;
 for(i=0;idata=i;
    p->next=(*L)->next;
    (*L)->next=p;
 }
}

//创建带头结点尾插法的链表
void CreateMeLink(Link *L,int n){
 *L=(LinkNode*)malloc(sizeof(LinkNode));
(*L)->next=NULL;
if(!L) exit(0);//申请失败退出程序
 Link q=NULL;
 q=*L;
 int i;
 Link p=NULL;
 for(i=0;idata=i;
    q->next=p;
    q=p;
 }
 q->next=NULL;//最后一个结点尾指针为空
}
//输出链表的所有元素
void printfElem(Link L){
Link  p=(LinkNode*)malloc(sizeof(LinkNode));
 p=L->next;
 while(p!=NULL){
    printf("%d\n",p->data);
    p=p->next;
 }

}
//返回第i个结点的数据
int getElem(Link L,int i){
 Link p=NULL;
 p=L->next;
 int j=1;
 while(jnext!=NULL){
        j++;
        p=p->next;
 }
 if(i!=j) {return -1;}
 else{
    return p->data;
}
 }
//返回第i个结点的数据,并删除该结点
int getElemType(Link *L,int i){
 Link p,q=(LinkNode*)malloc(sizeof(LinkNode));
 int j=1;
 int k;
 p=(*L)->next;
  while(jnext!=NULL){//找到第i-1个结点
    j++;
    p=p->next;
  }
  if(i!=j+1){
    return -1;
  }else{
    q=p->next;//此时q为第i个结点
    k=q->data;
    p->next=q->next;//或者p->next=p->next->next;

    free(q);
    return k;
  }
}
//在第i个结点前插入新的结点
void insertElement(Link *L,int i){

 Link p=NULL;
 p=(*L)->next;
 int j=1,k=i-1;
 while(jnext!=NULL){//定位p到第i-1个结点
        j++;
      p=p->next;
 }
 if(j!=k){
    return -1;
 }else{
  Link q=(LinkNode*)malloc(sizeof(LinkNode));
  scanf("%d",&q->data);
  q->next=p->next;
  p->next=q;

 }
}
int main()
{
    //测试各函数
    Link *L;
   int n;
   scanf("%d",&n);
   CreateMeLink(&L,n);
   // CreateHeadLink(&L,n);
    printfElem(L);
  //  printf("%d\n",getElem(L,2));
  // printf("%d\n",getElemType(&L,3));
  insertElement(&L,4);
    printfElem(L);
    return 0;
}

 

转载于:https://my.oschina.net/tanyonghu/blog/685531

你可能感兴趣的:(c/c++,数据结构与算法)