您的位置:首页 > 理论基础 > 数据结构算法

单链表及其基本操作的实现

2017-12-29 22:43 393 查看
请在以下给出的部分源程序基础上补全代码,完成单链表的C语言程序。然后再主函数通过调用单链表的操作中完成一下任务:首先定义一个单链表实例(变量),并初始化,采用尾插法向其中录入10个整数(ElemType为int类型);然后,在第5个结点处插入一个新结点(值为5),再把第8个结点删除;最后打印出所有元素。

/*①单链表数据结构定义*/

//结点定义

typedef struct LNode

{

ElemType data;

struct LNode *next;

}LNode;

//链表定义

typedef struct

{

LNode* head;  //指向头结点的指针

int length;     //链表长度

}LinkList;

/*②单链表基本操作接口定义*/

//初始条件:线性表L已经初始化

//采用头插法创建一个单链表,元素类型为整形,输入-9999时结束

Status CreateFromHead(LinkList &L);

 

//初始条件:线性表L已经初始化

//采用尾插法创建一个单链表,元素类型为整形,输入-9999时结束

Status  CreateFromTail(LinkList &L) ;

 

//初始条件:线性表L已经存在

//打印出所有元素

void PrintElem(LinkList L);

 

 

//初始条件:线性表L已经存在

//查找第i个结点,若找到(1≤i≤n),则由e返回其值

Status GetElem_L(LinkList L, int i,ElemType &e);

 

//初始条件:线性表L已经存在

//在单链线性表L的第i个元素之前插入元素e

Status ListInsert_L(LinkList &L, int i, ElemType e);

 

//初始条件:线性表L已经存在

//删除第i个元素,并由e返回其值

Status ListDelete_L(LinkList &L, int i, ElemType &e);

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status ;
typedef int ElemType ;
//结点定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

//单链表的初始化
Status InitList_L(LinkList &L);

//初始条件:线性表L已经初始化
//采用头插法创建一个单链表,元素类型为整形,输入-9999时结束
Status CreateFromHead(LinkList &L);

//初始条件:线性表L已经初始化
//采用尾插法创建一个单链表,元素类型为整形,输入-9999时结束
Status CreateFromTail(LinkList &L) ;

//初始条件:线性表L已经存在
//打印出所有元素
void PrintElem(LinkList L);

//初始条件:线性表L已经存在
//查找第i个结点,若找到(1≤i≤n),则由e返回其值
Status GetElem_L(LinkList L, int i,ElemType &e);

//初始条件:线性表L已经存在
//在单链线性表L的第i个元素之前插入元素e
Status ListInsert_L(LinkList &L, int i, ElemType e);

//初始条件:线性表L已经存在
//删除第i个元素,并由e返回其值
Status ListDelete_L(LinkList &L, int i, ElemType &e);

//单链表的初始化
Status InitList_L(LinkList &L)
{
L =(LNode *)malloc(sizeof(LNode)); //申请结点空间
if(L == NULL) //判断是否有足够的内存空间
printf("申请内存空间失败\n");
L->next = NULL; //将next设置为NULL,初始长度为0的单链表
return OK;
}

//初始条件:线性表L已经初始化
//采用头插法创建一个单链表,元素类型为整形,输入-9999时结束
Status CreateFromHead(LinkList &L)
{
LinkList s;
char c;
L=(LNode*)malloc(sizeof(LNode));//为头结点分配存储空间
L->next=NULL;
c = getchar();
while(c != '$')
{ /*为读入的字符分配存储空间*/
s=(LNode*)malloc(sizeof(LNode));
s->data=c;
s->next=L;
L=s;
}

return OK;
}

//初始条件:线性表L已经初始化
//采用尾插法创建一个单链表,元素类型为整形,输入-9999时结束
Status CreateFromTail(LinkList &L)
{
{
LinkList r, s;
int c;
L=(LNode * )malloc(sizeof(LNode));/*为头结点分配存储空间*/
L->next=NULL;
r=L; /*r指针始终动态指向链表的当前表尾*/
printf("请依次输入字符数据('-9999'表示输入结束):\n");
scanf("%d",&c);
while(c != -9999)/*标志,初值为1。输入“-9999”时flag为0,建表结束*/
{
s=(LNode*)malloc(sizeof(LNode));
s->data=c;
r->next=s;
r=s ;
scanf("%d",&c);
}
r->next=NULL;
}
return OK;
}

//初始条件:线性表L已经存在
//在单链线性表L的第i个元素之前插入元素e
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
LinkList s,p=L;
int j = 0;
while (p&&j < i-1)
{ // 寻找第i-1个结点
p = p->next;
++j;
}
if (!p || j > i-1) return ERROR; // i小于1或者大于表长
s = (LinkList)malloc(sizeof(LNode)); // 生成新结点
s->data = e; s->next = p->next; // 插入L中
p->next = s;
return OK;
} // LinstInsert_L

//初始条件:线性表L已经存在
//删除第i个元素,并由e返回其值
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
LinkList p=L,q;
int j = 0;
while (p->next && j < i-1)
{ // 寻找第i个结点,并令p指向其前趋
p = p->next; ++j;
}
if (!(p->next) || j > i-1) return ERROR; // 删除位置不合理
q = p->next;
p->next = q->next; // 删除并释放结点
e = q->data;
free(q);
return OK;
} // ListDelete_L

//初始条件:线性表L已经存在
//打印出所有元素
void PrintElem(LinkList L)
{
LinkList p=L->next ;
printf("当前的链表元素为:");
while(p)
{
printf(" %d",p->data);
p=p->next;
}
printf("\n");
}

//初始条件:线性表L已经存在
//查找第i个结点,若找到(1≤i≤n),则由e返回其值
Status GetElem_L(LinkList L, int i,ElemType &e)
{ LNode *p;
int j;
p=L->next; j=1; // 从头结点开始扫描
while (p&&j<i)
{
p=p->next; ++j; /* 扫描下一结点 */
} /* 已扫描结点计数器 */
if(!p||i>j) return ERROR;
e=p->data;
return OK;
}
void main()
{
LinkList L;
printf("**************尾插法创建单链表*******************\n");
printf("向单链表录入十个整数\n");
CreateFromTail(L);
PrintElem(L);
printf("\n在第5个结点处插入一个新结点(值为5)\n");
ListInsert_L(L,5,5);
PrintElem(L);
printf("\n第8个结点删除后\n");
ListDelete_L(L,8,L->data);
PrintElem(L);
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息