#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode //单链表的存储结构定义
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList; //*LinkList为LNode类型的指针 LNode *p == LinkList p
enum Status{ERROR,OK};
LinkList L,r;
Status InitList_L(LinkList &L) //初始化,构造一个空链表
{
L=(LinkList)malloc(sizeof(LNode));
if(L==NULL)
return ERROR;
L->next=NULL;
return OK;
}
Status DestoryList(LinkList &L) //销毁链表
{
LinkList pre=L; //前驱结点
LinkList p=L->next; //当前结点
while(p!=NULL);
{
free(pre);
pre=p;
p=p->next;
}
free(pre); //释放最后一个结点
printf("销毁成功\n");
return OK;
}
Status DestoryList_L(LinkList &L)
{
LinkList p;
while (L)
{
p=L;
L=L->next;
free(p);
}
return OK;
}
Status ClearList(LinkList &L) //将L置为空表
{
LinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
return OK;
}
int ListLength(LinkList L) //求表长,返回元素个数
{
LinkList p;
p=L->next; //因为头结点不计数
int i=0;
while(p) //遍历单链表,统计结点数
{
i++;
p=p->next;
}
return i;
}
Status ListEmpty(LinkList L) //判断是否为空表
{
if(L->next)
return ERROR;
else
return OK;
}
LinkList LocateElem_L(LinkList L,ElemType e) //返回L中值为e的地址,查找失败返回NULL
{
LinkList p;
p=L->next;
while(p&&p->data!=e)
{
p=p->next;
}
return p;
}
Status GetElem_L(LinkList L,int i,ElemType *e) //输入位置,返回数据域
{
LinkList p;
int j=1;
p=L->next;
for(j = 1; p!=NULL && j == i; j++)
{
p = p->next;
}
if(p == NULL || j > i)
{
return ERROR;
}
*e=p->data;
return OK;
}
int LocateElem(LinkList L,ElemType e) //返回L中值为e的数据元素的位置序号,查找失败返回0
{
LinkList p;
p=L->next;
int j=1;
while(p&&p->data!=e)
{
p=p->next;
j++;
}
if(p)
return j;
else
return 0;
}
Status LinkInsert_L(LinkList &L,int i,ElemType e) //在第i个元素之前插入数据元素e
{
LinkList p=L,s;
int j=0;
while(p&&j<i-1) //寻找第i-1 个结点
{
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;
}
int LinkDelete(LinkList &L,int i,ElemType *e) //删除单链表的某个结点
{
LinkList p=L,q;
//ElemType e;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
printf("位置不合理\n"); //删除位置不合理
q=p->next; //保存被删结点的地址,以备释放
p->next=q->next; //改变被删结点的前驱结点
*e=q->data; //保存删除结点的数据域
free(q); //删除空间
return 1;
}
Status CreateList_F(LinkList &L,int n) //输入的数据域会逆置,所以建议逆序输入
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
if(L==NULL)
return ERROR;
L->next=NULL;
for(int i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
return OK;
}
Status CreateList_L(LinkList &L,int n)
{
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
if(L==NULL)
return ERROR;
L->next=NULL;
r=L; //r始终指向尾结点
for(int i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=NULL;
r->next=p;
r=p; //r指向新的尾结点
}
return OK;
}
Status Print(LinkList L)
{
LinkList p;
p=L->next;
while(p)
{
printf("%d-> ",p->data);
p=p->next;
}
printf("NULL\n");
printf("\n");
return OK;
}
main()
{
LinkList L;
int i,n;
ElemType e;
InitList_L(L);
printf("输入结点个数\n");
scanf("%d",&n);
printf("输入数据域\n");
CreateList_F(L,n);
printf("此时得到了逆序的链表\n");
Print(L);
printf("此时,销毁链表....\n");
printf("输入结点数据域\n");
CreateList_L(L,n);
printf("此时得到正序的链表\n");
Print(L);
printf("插入结点,现在输入 位置,以及数据\n");
scanf("%d %d",&i,&e);
LinkInsert_L(L,i,e);
Print(L);
printf("删除结点,现在输入位置\n");
scanf("%d",&i);
if(LinkDelete(L,i,&e))
{
printf("删除:%d ",e);
Print(L);
}
printf("输入位置,返回它的数据域\n");
scanf("%d",&i);
GetElem_L(L,i,&e);
printf("当位置合理时,得到了 :%d\n",e);
printf("查找:输入元素,返回单链表中的位置序号,以及地址\n");
scanf("%d",&e);
if(LocateElem(L,e))
printf("位置序号:%d;地址:%d\n",LocateElem(L,e),LocateElem_L(L,e));
else
printf("没有找到\n");
printf("\n");
printf("清空链表\n");
ClearList(L);
printf("求表长\n");
printf("求表长\n");
printf("长度为:%d\n",ListLength(L));
}
初期化、シングルリンクリストの破棄、空のテーブルに設定、テーブルの長さの検索、空の判定、ビットによる検索、値による検索、挿入、削除、挿入前の確立、挿入後、印刷
おすすめ
転載: blog.csdn.net/September_C/article/details/105544625
おすすめ
ランキング