用c写链表

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41006598/article/details/90647310
#include<stdio.h>
#include<malloc.h>
typedef struct 
{
	char name[20];
	double score;
	char sno[20];
}student;
typedef struct LNode{
     student  data;       //数据域
     struct LNode  *next;   //指针域
}LNode,*LinkList;    // *LinkList为Lnode类型的指针
void InitList_L(LinkList L){ 
   L=(LNode *)malloc(sizeof(LNode));                	
   L->next=NULL;
} 
void DestroyList_L(LinkList L){//销毁链表 
    LinkList p;
       while(L)
        {
            p=L;  
            L=L->next;
            free(p);
        }
 }
 void  ClearList(LinkList L){
  // 将L重置为空表 
   LinkList p,q;
   p=L->next;   //p指向第一个结点
   while(p)       //没到表尾 
      {  q=p->next; free(p);     p=q;   }
   L->next=NULL;   //头结点指针域为空 
 }
 int ListLength(LinkList L)//求表长 
 {
 	LinkList p;
 	p=L->next;
 	int i=0;
 	while(p)
 	{
 		p=p->next;
 		i++;
	 }
	 return i;
 } 
void ListEmpty(LinkList L)
{
	if(L->next==NULL)
	   printf("该表是个空表\n");
	else
	   printf("表不为空\n");
 } 
 LinkList GetElem_L(LinkList L,int i)//获取链表中第i个元素的地址 
 {
 	LinkList p=L->next;
 	int j=1;
 	while(p&&j<i)
 	{
 		p=p->next;
 		j++;
	 }
	 return p;
	/* if(j>i)
	 {
	 	printf("表中无该节点\n");
	 }
    else {
    	 return p;
	}*/
 }
 LNode* LocateELem_L (LinkList L,student *e) {
 //返回L中值为e的数据元素的地址,查找失败返回NULL
  LinkList p;
  p=L->next;
  while(p&&(p->data.name!=e->name))
        p=p->next;               		
        return p; 	
} 
int LocateELem_Lnumber (LinkList L,student *e) {
  LinkList p;
  p=L->next;
  int j=1;
  while(p&&(p->data.name!=e->name))
        {
        	p=p->next;   
        	j++;
		} 
		if(p)           		
        return j; 	
} 
int  ListInsert_L(LinkList L,int i,student *e){
      LinkList p,s; 
      p=L->next;
	  int j=1; 
      while(p&&j<i-1)
	  {
	  p=p->next;
	  ++j;
	  }	//寻找第i-1个结点 
      if(!p||j>i-1)
	  return 0;	//i大于表长+1或者小于1  
      s=(LNode *)malloc(sizeof(LNode)); //生成新结点s 
      s->data=*e;      		           //将结点s的数据域置为e 
      s->next=p->next;	   	          //将结点s插入L中 
      p->next=s; 
      return 1; 
}//ListInsert_L 
int ListDelete_L(LinkList L,int i,student *e){
    LinkList p,q;
	p=L->next;
	int j=1; 
    while(p->next &&j<i-1){//寻找第i个结点,并令p指向其前驱 
        p=p->next;
		++j; 
    } 
    if(!(p->next)||j>i-1)
	return 0; //删除位置不合理 
    q=p->next; //临时保存被删结点的地址以备释放 
    p->next=q->next; //改变删除结点前驱结点的指针域 
    *e=q->data; 	//保存删除结点的数据域 
    free(q); 	//释放删除结点的空间 
    return 1; 
}//ListDelete_L 
LinkList CreateList_F(LinkList L,int n)
{
	LinkList p;
	L=(LNode *)malloc(sizeof(LNode)); 
    L->next=NULL;
	int i;
	for(i=n;i>0;i--)
	{
     	p=(LNode *)malloc(sizeof(LNode)); 
     	printf("姓名,学号,分数\n");
     	scanf("%s",p->data.name);
     	scanf("%s",p->data.sno);
     	scanf("%d",&p->data.score);
		p->next=L->next;
		L->next=p;	
	}
	return  L;
}
void main()
{
	LNode L;
	LinkList Lf=CreateList_F(&L,3);
	printf("%s\n",Lf->next->next->data.name);
	LinkList p=GetElem_L(Lf,1);	
	printf("----------------------\n");
	printf("%s\n",p->data.name);
	student e;
	ListDelete_L(Lf,2,&e); 
	printf("%s\n",Lf->next->next->data.name);
		
		
}
               

猜你喜欢

转载自blog.csdn.net/qq_41006598/article/details/90647310
今日推荐