c语言线性链表是什么意思,线性链表(C语言实现)

#include#include

#define ERROR 0

#define OK 1

#define EQUAL 1

#define OVERFLOW -1

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

struct STU{

char name[20];

char stuno[10];

int age;

int score;

}stu[50];

typedef struct STU ElemType;

struct LNODE

{

ElemType data;

struct LNODE *next;

};

typedef struct LNODE LNode;

typedef struct LNODE *LinkList;

int init(LinkList *L)

{

*L=(LNode *)malloc(sizeof(LNode));

if(!L)   exit(ERROR);

(*L)->next=NULL;

return OK;

}/*init */

int ListLength(LinkList L)

{

int j=0;

while (L->next)

{

L=L->next;

j++;

}

return j;

}

int GetElem(LinkList L,int i,ElemType *e)

{

LinkList p; int j;

p=L->next;j=1;

while(p&&jp=p->next;++j;

}

if(!p||j>1)  return ERROR;

*e=p->data;

return OK;

}

int EqualList(ElemType *e1,ElemType *e2)

{

if (strcmp(e1->name,e2->name)==0)

return 1;

else

return 0;

}

int Less_EqualList(ElemType *e1,ElemType *e2)

{

if (strcmp(e1->name,e2->name)<=0)

return 1;

else

return 0;

}

int DeleteElem(LinkList L,int i)

{

LinkList p,q;  int j;

j=0;

p=L;

while (p->next && jq=p;p=p->next; ++j;

}

if(!p)  return ERROR;

q->next=p->next;

return OK;

}

ElemType* PriorElem(LinkList L,ElemType e)

{

int i;

LinkList p,q;

p=L;

while (p->next)

{

q=p; p=p->next;

/*printf("(p->data).stuno:%s",(p->data).stuno);*/

/*printf("e.stuno:%s",e.stuno);*/

if (strcmp((p->data).stuno,e.stuno)==0)

return &(q->data);

}

return NULL;

}

int LocateElem(LinkList La,ElemType e,int type)

{

int i;

LinkList p;

p=La;

switch (type)

{

case EQUAL:

while(p->next)

{

p=p->next;

if(EqualList(&p->data,&e))

return 1;

}

return 0;

break;

default:

break;

}

return 0;

}

void MergeList(LinkList La,LinkList Lb,LinkList *Lc)

{

LinkList pa,pb,pc;

pa=La->next;pb=Lb->next;

*Lc=pc=La;

while(pa && pb)

{

if(Less_EqualList(&pa->data,&pb->data))

{

pc->next=pa;pc=pa;pa=pa->next;

}

else

{

pc->next=pb;pc=pb;pb=pb->next;

}

}

pc->next=pa?pa:pb;

free(Lb);

}

int printlist(LinkList L)

{

int i;

LinkList p;

p=L;

printf("name       stuno        age     score/n");

while(p->next)

{

p=p->next;

printf("%-10s %s/t%d/t%d/n",  p->data.name,  p->data.stuno,

p->data.age,  p->data.score);

}

printf("/n");

}

int ListInsert(LinkList L,int i,ElemType e)

{

LinkList p,s;

int j;

p=L;j=0;

while(p&&j{

p=p->next;

++j;

}

if(!p||j>i-1) return ERROR;

s=(LinkList)malloc(sizeof(LNode));

s->data=e;

s->next=p->next;

p->next=s;

return OK;

}/*ListInsert Before i */

int main()

{

struct STU e,t,*p;

LinkList La,Lb,Lc;

printf("/n/n-------------------List Demo is running...----------------/n/n");

printf("First is InsertList function./n");

init(&La);

strcpy(e.name,"stu1");

strcpy(e.stuno,"100001");

e.age=80;

e.score=1000;

ListInsert(La,1,e);

strcpy(e.name,"stu3");

strcpy(e.stuno,"100002");

e.age=80;

e.score=1000;

ListInsert(La,2,e);

printlist(La);

getch();

strcpy(e.name,"stu5");

strcpy(e.stuno,"100003");

e.age=80;

e.score=1000;

ListInsert(La,3,e);

printlist(La);

getch();

strcpy(t.name,"stu3");

strcpy(t.stuno,"100002");

t.age=80;

t.score=1000;

p=PriorElem(La,t);

printf("p is the :%s/n/n",p->stuno);

getch();

strcpy(t.name,"stu5");

strcpy(t.stuno,"100003");

t.age=80;

t.score=1000;

p=PriorElem(La,t);

printf("p is the :%s/n/n",p->stuno);

getch();

strcpy(t.name,"stu1");

strcpy(t.stuno,"100001");

t.age=80;

t.score=1000;

p=PriorElem(La,t);

printf("p is the :%s/n/n",p->stuno);

getch();

printf("Test DeleteElem/n");

DeleteElem(La,1);

printlist(La);

getch();

init(&Lb);

strcpy(e.name,"stu2");

strcpy(e.stuno,"100001");

e.age=80;

e.score=1000;

ListInsert(Lb,1,e);

strcpy(e.name,"stu4");

strcpy(e.stuno,"100002");

e.age=80;

e.score=1000;

ListInsert(Lb,2,e);

strcpy(e.name,"stu6");

strcpy(e.stuno,"100001");

e.age=80;

e.score=1000;

ListInsert(Lb,3,e);

printlist(Lb);

getch();

MergeList(La,Lb,&Lc);

printlist(Lc);

getch();

printf("/n/n/n/n/n/nWelcome to visit http://zmofun.heha.net !/n/n/n/n/n/n/n");

getch();

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值