![]() |
#2
yuanpeng2017-05-08 22:10
|

/*链表: 建立单链表,顺序输入5个数,然后在第3个结点前面插入一个结点,接着
删除第3个结点,并显示表中所有结点数据值,给定1-5中的任意整数i,给出链表
中第i个结点的数据值。*/
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//链表的类型定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表的初始化函数定义
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)exit(OVERFLOW);
L->next=NULL;
return OK;
}
//链表的建立函数定义
void CreateList(LinkList &L,int n)
{
//逆序输入n个元素的值,建立带表头结点的线性链表
int i; LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //建立头结点
printf("输入数据: ");
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data);
p->next=L->next; L->next=p; //插入到表头
}
}
//链表的插入函数定义
Status ListInsert(LinkList &L,int i,ElemType e)
{
//在带头结点的线性链表L中第i元素结点之前插入元素e
LinkList p,s; int j=0;
p=L;
while(p&&j<i-1) //寻找第i个元素前面一个结点
{
p=p->next; //p指向第1个元素结点时,j=1....p指向第i-1个元素结点时,j=i-1,不再执行
++j; //j用于计数
}
if(!p||j>i-1) //i小于1或者大于表长
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //分配新结点
s->data=e;
s->next=p->next; p->next=s; //在第i-1个结点和第i个结点之间插入
return OK;
}
//链表的删除函数定义
Status ListDelete(LinkList &L,int i,ElemType &e)
{
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q; int j=0;
p=L;
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;//p指向第i-1个元素,q指向第i个元素,然后将第i个和第i+1个元素连接
e=q->data;
free(q);
return OK;
}
//给定i值,获得链表中对应结点数据值的函数定义
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
int j;
p=L->next; j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p&&j>i)
return ERROR;
e=p->data;
return OK;
}
//链表的销毁函数定义
Status Destroy(LinkList &L)
{
LinkList p;
while(L=!NULL)
{
p=L->next;
free(L); //从开头开始释放空间
L=p;
}
}
//链表各结点数据值打印输出函数定义
void print(LinkList &L)
{
LinkList p;
p=L->next;
if(L!=NULL)
{
printf("打印输出: ");
do{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
}
}
void main()
{
//变量定义
LinkList L;
ElemType e;
int i;
//链表初始化函数调用
InitList(L);
//链表建立函数调用
CreateList(L,5);
//链表各结点数据值打印输出函数调用
print(L);
//链表的插入函数调用,实现在第3个结点前面插入一个结点,结点数据值通过键盘输入
printf("\n在第3个结点前面插入一个结点:");
scanf("%d",&e);
ListInsert(L,3,e);
//链表各结点数据值打印输出函数调用
print(L);
//链表的删除函数调用,实现删除第3个结点,删除的结点数据值复制给变量e
printf("\n删除第三个结点,");
ListDelete(L,3,e);
//链表各结点数据值打印输出函数调用
print(L);
//给定i值,获得链表中对应结点数据值的函数调用
printf("\n取第i个结点的数据值: ");
scanf("%d",&i);
GetElem(L,i,e);
printf("Data值为: %d\n",e);
//链表的销毁函数调用
Destroy(L);
}
删除第3个结点,并显示表中所有结点数据值,给定1-5中的任意整数i,给出链表
中第i个结点的数据值。*/
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
//链表的类型定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表的初始化函数定义
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)exit(OVERFLOW);
L->next=NULL;
return OK;
}
//链表的建立函数定义
void CreateList(LinkList &L,int n)
{
//逆序输入n个元素的值,建立带表头结点的线性链表
int i; LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //建立头结点
printf("输入数据: ");
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data);
p->next=L->next; L->next=p; //插入到表头
}
}
//链表的插入函数定义
Status ListInsert(LinkList &L,int i,ElemType e)
{
//在带头结点的线性链表L中第i元素结点之前插入元素e
LinkList p,s; int j=0;
p=L;
while(p&&j<i-1) //寻找第i个元素前面一个结点
{
p=p->next; //p指向第1个元素结点时,j=1....p指向第i-1个元素结点时,j=i-1,不再执行
++j; //j用于计数
}
if(!p||j>i-1) //i小于1或者大于表长
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //分配新结点
s->data=e;
s->next=p->next; p->next=s; //在第i-1个结点和第i个结点之间插入
return OK;
}
//链表的删除函数定义
Status ListDelete(LinkList &L,int i,ElemType &e)
{
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q; int j=0;
p=L;
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;//p指向第i-1个元素,q指向第i个元素,然后将第i个和第i+1个元素连接
e=q->data;
free(q);
return OK;
}
//给定i值,获得链表中对应结点数据值的函数定义
Status GetElem(LinkList L,int i,ElemType &e)
{
LinkList p;
int j;
p=L->next; j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p&&j>i)
return ERROR;
e=p->data;
return OK;
}
//链表的销毁函数定义
Status Destroy(LinkList &L)
{
LinkList p;
while(L=!NULL)
{
p=L->next;
free(L); //从开头开始释放空间
L=p;
}
}
//链表各结点数据值打印输出函数定义
void print(LinkList &L)
{
LinkList p;
p=L->next;
if(L!=NULL)
{
printf("打印输出: ");
do{
printf("%d ",p->data);
p=p->next;
}while(p!=NULL);
}
}
void main()
{
//变量定义
LinkList L;
ElemType e;
int i;
//链表初始化函数调用
InitList(L);
//链表建立函数调用
CreateList(L,5);
//链表各结点数据值打印输出函数调用
print(L);
//链表的插入函数调用,实现在第3个结点前面插入一个结点,结点数据值通过键盘输入
printf("\n在第3个结点前面插入一个结点:");
scanf("%d",&e);
ListInsert(L,3,e);
//链表各结点数据值打印输出函数调用
print(L);
//链表的删除函数调用,实现删除第3个结点,删除的结点数据值复制给变量e
printf("\n删除第三个结点,");
ListDelete(L,3,e);
//链表各结点数据值打印输出函数调用
print(L);
//给定i值,获得链表中对应结点数据值的函数调用
printf("\n取第i个结点的数据值: ");
scanf("%d",&i);
GetElem(L,i,e);
printf("Data值为: %d\n",e);
//链表的销毁函数调用
Destroy(L);
}
只有本站会员才能查看附件,请 登录