实现单链表

因为在传递函数参数时,使用了引用,所以该程序为C++程序

#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode *next;
int length;
}LNode, *LinkList;
int CreatList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(L==NULL){printf("创建失败");return 0;}
L->next=NULL;
return 1;
}//创建一个链表的头结点
void ListTailInsert(LinkList &L,ElemType e){
LinkList r,s;
r=L;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=NULL;
while(r->next!=NULL){
r=r->next;
}
r->next=s;
}//尾插法填充节点
void ListPrint(LinkList &L){
LinkList p;
int i=0;
p=L->next;
printf("链表为:");
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
i++;
}
printf("\n");
L->length=i;
printf("链表的长度为:%d\n",L->length);
}//打印链表
LNode *GetElem(LinkList &L,int i){
int j=1;
LinkList p=L->next;
if(i<1||i>L->length){
printf("寻找的i的位置无效");
}
while(p!=NULL){
if(j==i){return p;}
p=p->next;
j++;
}
}//查找第i个结点
LNode *LocateElem(LinkList &L,ElemType e){
LinkList p=L->next;
int flag=0;
while(p!=NULL){
if(p->data==e){flag=1;return p;}
p=p->next;
}
if(flag==0){printf("未找到该结点");}
}//按值查找表节点并返回该结点
void ListInsert(LinkList &L,int i,ElemType e){
LinkList s,p;
if(i<0||i>L->length){printf("插入的i的位置无效");}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
if(i==1){
s->next=L->next;
L->next=s;
}//在第一个结点插入的特殊情况
else{p=GetElem(L,i-1);
s->next=p->next;
p->next=s;}
}//将结点值为e的
void ListDelete(LinkList &L,int i){
LinkList p;
if(i<0||i>L->length){printf("删除的i的位置无效");}
if(i==1){
L->next=L->next->next;
}//在第一个结点删除的特殊情况
else{p=GetElem(L,i-1);
p->next=p->next->next;}
}//删除第i个结点
int main(){
LinkList L;
LinkList q;
LinkList p;
CreatList(L);
ListTailInsert(L,1);
ListTailInsert(L,2);
ListTailInsert(L,3);
ListTailInsert(L,4);
ListTailInsert(L,5);
ListPrint(L);
q=LocateElem(L,2);
printf("%d\n",q->data);
p=GetElem(L,3);
printf("%d\n",p->data);
ListInsert(L,1,6);
ListInsert(L,3,7);
ListPrint(L);
ListDelete(L,1);
ListDelete(L,5);
ListPrint(L);
return 0;
}

下面为运行结果

实现单链表

上一篇:俩个递增有序单链表的合并算法(含头结点)


下一篇:C语言 - 申请内存