数据结构C语言—线性表【链式存储】动态单链表(malloc动态分配实现)
SingleLinkListMalloc.h
#define NOEXIST -1
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE 1
#define OVERFLOW 1
typedef int Status;
typedef int DataType;
typedef int *Pt;
typedef struct LNode
{
DataType data;
struct LNode* next;
}LNode,*LinkList;
typedef struct SLinkList
{
LinkList head,tail;
DataType len;
}SLinkList;
Status Init_SLinkList(SLinkList* S);
void Head_Init_SLinkList(SLinkList* S);
void Tail_Init_SLinkList(SLinkList* S);
Status DestoryList(SLinkList* S);
void ClearList(SLinkList* S);
Status IsEmptySLinkList(SLinkList* S);
DataType SLinkListLength(SLinkList* S);
DataType GetElem(SLinkList* S,DataType i,Pt e);
DataType LocateElem(SLinkList* S,DataType e);
Status PriorElem(SLinkList* S,DataType e,Pt proe);
Status NextElem(SLinkList* S,DataType e,Pt nexte);
Status SLinkListInsert(SLinkList* S,DataType i,DataType e);
DataType SLinkListDelete(SLinkList* S,DataType i,Pt e);
Status SLinkListTraverse(SLinkList* S);
SingleLinkListMalloc.c
#include "SingleLinkListMalloc.h"
#include <stdio.h>
Status Init_SLinkList(SLinkList* S)
{
puts("====开始初始化动态单链表S!====");
S->head=(LinkList)malloc(sizeof(LNode));
if(S->head!=NULL)
{
S->head->next=NULL;
S->head->data=0;
S->tail=S->head;
S->len=0;
puts("====动态单链表S初始化完成!====");
return OK;
}
else
{
puts("动态链表初始化(创建头结点)失败!");
return ERROR;
}
}
void Head_Init_SLinkList(SLinkList* S)
{
DataType n,k,co=0;
LinkList q;
fflush(stdin);
printf("\n开始头插法(以f结束):");
while(1)
{
k=scanf("%d",&n);
if(k==0)
{
break;
}
else
{
q=(LinkList)malloc(sizeof(LNode));
if(q!=NULL)
{
q->data=n;
q->next=S->head->next;
S->head->next=q;
co++;
(S->len)++;
if(co==1)
{
S->tail=q;
}
}
else
{
puts("头插法创建元素结点失败!");
}
}
}
fflush(stdin);
}
void Tail_Init_SLinkList(SLinkList* S)
{
DataType n,k;
LinkList q;
fflush(stdin);
printf("\n开始尾插法(以f结束):");
while(1)
{
k=scanf("%d",&n);
if(k==0)
{
break;
}
else
{
q=(LinkList)malloc(sizeof(LNode));
if(q!=NULL)
{
q->data=n;
q->next=S->tail->next;
S->tail->next=q;
(S->len)++;
S->tail=q;
}
else
{
puts("尾插法创建元素结点失败!");
}
}
}
fflush(stdin);
}
Status DestoryList(SLinkList* S)
{
if(S->len==0)
{
puts("\n==开始【销毁】动态单链表S!==");
}
else
{
puts("\n==开始【销毁】动态单链表S!==");
LinkList p=S->head->next;
LinkList q=p;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
S->len=0;
S->tail=S->head;
S->head->next=NULL;
}
free(S->head);
S->head=NULL;
puts("==【销毁】动态单链表S完成!==");
return OK;
}
void ClearList(SLinkList* S)
{
if(S->len==0)
{
puts("\n==开始【清空】动态单链表S!==");
puts("==【清空】动态单链表S完成!==");
}
else
{
puts("\n==开始【清空】动态单链表S!==");
LinkList p=S->head->next;
LinkList q=p;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
S->len=0;
S->tail=S->head;
S->head->next=NULL;
puts("==【清空】动态单链表S完成!==");
}
}
Status IsEmptySLinkList(SLinkList* S)
{
if(S->head==NULL)
{
puts("======表不存在!不能判断是否为空表!======");
return NOEXIST;
}
if(S->len==0)
{
return TRUE;
}
else
{
return FALSE;
}
}
DataType SLinkListLength(SLinkList* S)
{
return S->len;
}
DataType GetElem(SLinkList* S,DataType i,Pt e)
{
if(IsEmptySLinkList(S)==TRUE)
{
printf("\n当前表空,不能查询!\n",i);
return ERROR;
}
if(i>SLinkListLength(S)||i<1)
{
printf("\n当前查询位置%d不合法!\n",i);
return ERROR;
}
LinkList p=S->head->next;
DataType co=0;
while(p!=NULL)
{
co++;
if(co==i)
{
*e=p->data;
return OK;
}
p=p->next;
}
}
DataType LocateElem(SLinkList* S,DataType e)
{
if(IsEmptySLinkList(S)==TRUE)
{
return ERROR;
}
LinkList p=S->head->next;
DataType co=0;
while(p!=NULL)
{
co++;
if(p->data==e)
{
return co;
}
p=p->next;
}
return ERROR;
}
Status PriorElem(SLinkList* S,DataType e,Pt proe)
{
if(IsEmptySLinkList(S)==TRUE)
{
*proe=-6699;
printf("\n当前表S空,不能查询%d的前驱值!\n",e);
return ERROR;
}
if(IsEmptySLinkList(S)!=TRUE&&LocateElem(S,e)==ERROR)
{
*proe=-6699;
printf("\n值%d不在表S中,无法返回其前驱值!\n",e);
return ERROR;
}
if(LocateElem(S,e)==1)
{
*proe=-6699;
printf("值%d是表S第一个元素,无前驱值!\n",e);
return ERROR;
}
LinkList p=S->head->next;
DataType co=0;
while(p!=NULL)
{
co++;
if(co==LocateElem(S,e)-1)
{
*proe=p->data;
return OK;
}
p=p->next;
}
}
Status NextElem(SLinkList* S,DataType e,Pt nexte)
{
if(IsEmptySLinkList(S)==TRUE)
{
*nexte=-6699;
printf("\n当前表S空,不能查询%d的后继值!\n",e);
return ERROR;
}
if(IsEmptySLinkList(S)!=TRUE&&LocateElem(S,e)==ERROR)
{
*nexte=-6699;
printf("\n值%d不在表S中,无法返回其后继值!\n",e);
return ERROR;
}
if(LocateElem(S,e)==S->len)
{
*nexte=-6699;
printf("值%d是表S最后一个元素,无后继值!\n",e);
return ERROR;
}
LinkList p=S->head->next;
DataType co=0;
while(p!=NULL)
{
co++;
if(co==LocateElem(S,e)+1)
{
*nexte=p->data;
return OK;
}
p=p->next;
}
}
Status SLinkListInsert(SLinkList* S,DataType i,DataType e)
{
if(i>SLinkListLength(S)+1||i<1)
{
printf("\n插入位置%d不合法,不能再插入!\n",i);
return ERROR;
}
LinkList p=S->head;
LinkList q;
DataType co=-1;
q=(LinkList)malloc(sizeof(LNode));
if(q!=NULL)
{
q->data=e;
while(p!=NULL)
{
co++;
if(co==i-1)
{
q->next=p->next;
p->next=q;
S->len++;
if(i==SLinkListLength(S))
{
S->tail=q;
}
return OK;
}
p=p->next;
}
}
else
{
puts("待插入元素结点失败!");
}
}
DataType SLinkListDelete(SLinkList* S,DataType i,Pt e)
{
if(SLinkListLength(S)==0)
{
printf("\n当前表S空,不能删除任何值!\n");
return ERROR;
}
if(i>SLinkListLength(S)||i<1)
{
printf("\n删除位置%d不合法,不能删除任何值!\n",i);
return ERROR;
}
LinkList p=S->head;
LinkList q;
DataType co=-1;
while(p!=NULL)
{
co++;
if(co==i-1)
{
q=p;
}
if(co==i)
{
q->next=p->next;
free(p);
S->len--;
if(i==SLinkListLength(S))
{
S->tail=q;
}
return OK;
}
p=p->next;
}
}
Status SLinkListTraverse(SLinkList* S)
{
if(S->head==NULL)
{
puts("<===============线性动态单链表S已被销毁!无法遍历检查!===============>");
return ERROR;
}
LinkList p=S->head->next;
if(S->len==0)
{
printf("【遍历检查】|长度:%d|头结点-->NULL\n",S->len);
}
else
{
printf("【遍历检查】|长度:%d|头结点",S->len);
while(p!=NULL)
{
printf("--->%d",p->data);
p=p->next;
}
printf("-->NULL\n");
}
return OK;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "SingleLinkListMalloc.h"
int main()
{
SLinkList S;
DataType i,e,proe,nexte,n;
Init_SLinkList(&S);
SLinkListTraverse(&S);
printf("S中当前元素个数是:%d",SLinkListLength(&S));
if(IsEmptySLinkList(&S))
{
printf("\n======S是空表!======\n");
}
else
{
printf("\n======S不是空表!======\n");
}
Tail_Init_SLinkList(&S);
SLinkListTraverse(&S);
printf("S中当前元素个数是:%d\n",SLinkListLength(&S));
if(IsEmptySLinkList(&S))
{
printf("\n======S是空表!======\n");
}
else
{
printf("\n======S不是空表!======\n");
}
printf("请输入要查询的位置:");
scanf("%d",&i);
if(GetElem(&S,i,&e))
{
printf("S表中%d位置值是:%d\n",i,e);
}
printf("请输入要查询位置的值:");
scanf("%d",&n);
if(LocateElem(&S,n)!=ERROR)
{
printf("\nS表中值%d所在位置是:%d\n",n,LocateElem(&S,n));
}
else
{
if(IsEmptySLinkList(&S)==TRUE)
{
printf("\n当前表空,不能查询%d的位置!\n",n);
}
else
{
printf("\n值%d的不在表中,可以加入表中!\n",n);
}
}
printf("请输入要返回其前驱的元素值:");
scanf("%d",&e);
if(PriorElem(&S,e,&proe)!=ERROR)
{
printf("值%d的前驱值是:%d\n",e,proe);
}
printf("请输入要返回其后继的元素值:");
scanf("%d",&e);
if(NextElem(&S,e,&nexte)!=ERROR)
{
printf("值%d的后继值是:%d\n",e,nexte);
}
printf("请输入要插入的位置和值:");
scanf("%d %d",&i,&e);
SLinkListInsert(&S,i,e);
SLinkListTraverse(&S);
fflush(stdin);
printf("请输入要删除的位置:");
scanf("%d",&i);
SLinkListDelete(&S,i,&e);
SLinkListTraverse(&S);
ClearList(&S);
SLinkListTraverse(&S);
printf("S中当前元素个数是:%d",SLinkListLength(&S));
if(IsEmptySLinkList(&S))
{
printf("\n======S是空表!======\n");
}
else
{
printf("\n======S不是空表!======\n");
}
Head_Init_SLinkList(&S);
SLinkListTraverse(&S);
printf("S中当前元素个数是:%d\n",SLinkListLength(&S));
if(IsEmptySLinkList(&S))
{
printf("\n======S是空表!======\n");
}
else
{
printf("\n======S不是空表!======\n");
}
printf("请输入要查询的位置:");
scanf("%d",&i);
if(GetElem(&S,i,&e))
{
printf("S表中%d位置值是:%d\n",i,e);
}
printf("请输入要查询位置的值:");
scanf("%d",&n);
if(LocateElem(&S,n)!=ERROR)
{
printf("\nS表中值%d所在位置是:%d\n",n,LocateElem(&S,n));
}
else
{
if(IsEmptySLinkList(&S)==TRUE)
{
printf("\n当前表空,不能查询%d的位置!\n",n);
}
else
{
printf("\n值%d的不在表中,可以加入表中!\n",n);
}
}
printf("请输入要返回其前驱的元素值:");
scanf("%d",&e);
if(PriorElem(&S,e,&proe)!=ERROR)
{
printf("值%d的前驱值是:%d\n",e,proe);
}
printf("请输入要返回其后继的元素值:");
scanf("%d",&e);
if(NextElem(&S,e,&nexte)!=ERROR)
{
printf("值%d的后继值是:%d\n",e,nexte);
}
printf("请输入要插入的位置和值:");
scanf("%d %d",&i,&e);
SLinkListInsert(&S,i,e);
SLinkListTraverse(&S);
fflush(stdin);
printf("请输入要删除的位置:");
scanf("%d",&i);
SLinkListDelete(&S,i,&e);
SLinkListTraverse(&S);
ClearList(&S);
SLinkListTraverse(&S);
printf("S中当前元素个数是:%d",SLinkListLength(&S));
if(IsEmptySLinkList(&S))
{
printf("\n======S是空表!======\n");
}
else
{
printf("\n======S不是空表!======\n");
}
DestoryList(&S);
SLinkListTraverse(&S);
system("pause");
return 0;
}
运行结果示例
------------------------------------------------------第四次发文章有点激动啊!----------------------------------------------------- -----------------------------------------------------【数据结构代码自编练习】------------------------------------------------------ ----------------------------------------------------------------【TDTX】-----------------------------------------------------------------
|