版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
#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);
}