c语言线性链表的实现方法,线性链表的c语言实现

#include

#include

typedef int Status;

typedef int Elemtype;

typedef struct LNode{

Elemtype data;

struct LNode *next;

}*LinkList;

Status InitList(LinkList &L){

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

L->next=NULL;

return 1;

}

Status DestoryList(LinkList &L){

LNode *p,*q;

p=L;

while(p->next){

q=p->next;

free(p);

p=q;

}

return 1;

}

Status IsListEmpty(LinkList &L){

if(!L->data) return 1;

return 0;

}

Status ListLength(LinkList &L){

LNode *p;

p=L;

int i=0;

while(p->next){

p=p->next;

i++;

}

return i;

}

Status GetElem(LinkList &L,int i,Elemtype &e){

LNode *p;

int j=0;

p=L;

while(p->next&&j

p=p->next;

j++;

}

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

e=p->data;

return 1;

}

Status LocateElem(LinkList &L,Elemtype e){

LNode *p;

p=L;

int i=0;

while(p->next){

i++;

if(p->data==e)

return i;

p=p->next;

}

return 0;

}

Status PriorElem(LinkList &L,Elemtype cur_e,Elemtype &pre_e){

LNode *p,*q;

p=L;

int i=0;

while(p->next){

q=p;

i++;

p=p->next;

if(p->data==cur_e) {

q->data=pre_e;

return 1;

}

}

return 0;

}

Status NextElem(LinkList &L,Elemtype cur_e,Elemtype &next_e){

LNode *p;

p=L;

int i=0;

while(!p->next){

i++;

if(p->data==cur_e){

p->next->data=next_e;

return 1;

}

p=p->next;

}

return 0;

}

Status Listsert(LinkList &L,int i,Elemtype e){

LNode *p;

int j=0;

p=L;

while(p&&j

p=p->next;

j++;

}

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

LNode *s;

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

s->data=e; s->next=p->next;

p->next=s;

return 1;

}

Status ListDelete(LinkList &L,int i,Elemtype &e){

LNode *p,*q;

int j=0;

p=L;

while(p->next&&j

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;

}

Status PrintList(LinkList &L){

LNode *p;

p=L;

while(p->next){

p=p->next;

printf("%d\n",p->data);

}

return 1;

}

int main(){

LinkList l;

InitList(l);

int set,isclose,locate;

Elemtype e,cur_e,pre_e,next_e;

/*student student[10];

for(int i=0;i<2;i++){

scanf("%s %d",student[i].name,&student[i].score);

Push(s,student[i]);

}

PrintStack(s);

*/

while(1){

set=0;

printf(" 1.插入元素\n 2.删除指定位置元素并输出\n 3.输出链表的长度\n 4.销毁链表\n 5.在指定元素前插入一个元素 \n 6.查询该链表是否为空 \n 7.输出位置元素\n 8.输出整个链表中的所有元素\n 9.建立链表(在销毁后重建)\n");

scanf("%d",&set);

switch(set){

case 1:printf("请输入元素及要插入的位置,用空格分隔\n");scanf("%d %d",&e,&locate);if(Listsert(l,locate,e)) printf("插入成功\n");else printf("插入失败\n"); break;

case 2:printf("请输入要删除的位置\n");scanf("%d",&locate);if(ListDelete(l,locate,e))printf("%d\n",e);else printf("链表里无元素\n");break;

case 3:printf("%d\n",ListLength(l));break;

case 4:if(DestoryList(l)) printf("销毁成功\n");break;

case 5:printf("请输入指定的元素和要插入的元素\n");scanf("%d %d",&cur_e,&pre_e); if(PriorElem(l,cur_e,pre_e)) printf("插入成功\n");break;

case 6:if(IsListEmpty(l)) printf("链表为空\n"); else printf("链表不为空\n");break;

case 7:printf("请输入要输出的位置\n");scanf("%d",&locate);if(GetElem(l,locate,e))printf("%d\n",e);else printf("链表里无元素\n");break;

case 8:PrintList(l);break;

case 9:InitList(l);break;

}

printf("结束输入0\n");

scanf("%d",&isclose);

if(!isclose) break;

}

return 0;

}

本文出自 “zjwzjw369” 博客,谢绝转载!

原文:http://zjwzjw369.blog.51cto.com/10388875/1660365

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值