link.h
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
LNode *next;
}*LinkList;
void CreateList(LinkList &L,int n) ;
void CreateList2(LinkList &L,int n);
void printList(LinkList L);
Status ListInsert(LinkList L,int i,ElemType e);
Status ListDelete(LinkList L,int i,ElemType &e);
link.cpp
#include<malloc.h> // malloc()等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include "link.h"
#define OK 1
#define ERROR 0
void CreateList(LinkList &L,int n) // 算法2.11
{ // 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L
int i;
LinkList p;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; // 先建立一个带头结点的单链表
printf("请输入%d个数据\n",n);
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode)); // 生成新结点
scanf("%d",&p->data); // 输入元素值
p->next=L->next; // 插入到表头
L->next=p;
}
}
void CreateList2(LinkList &L,int n)
{ // 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表
int i;
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode)); // 生成头结点
L->next=NULL;
q=L;
printf("请输入%d个数据\n",n);
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=q->next;
}
p->next=NULL;
}
void printList(LinkList L)
{
LinkList p;
for(p=L->next;p!=NULL;p=p->next)
printf("%d ",*p);
}
Status ListInsert(LinkList L,int i,ElemType e) // 算法2.9。不改变L
{ // 在带头结点的单链线性表L中第i个位置之前插入元素e
int j=0;
LinkList p=L,s;
while(p&&j<i-1) // 寻找第i-1个结点
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小于1或者大于表长
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
{ // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
int j=0;
LinkList p=L,q;
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;
}
linkmain.cpp
#include <stdio.h>
#include "link.h"
void main()
{
int n=5;
int i,e;
LinkList La,Lb;
CreateList(La,n); // 逆位序输入n个元素的值
printf("La="); // 输出链表La的内容
printList(La);
printf("输入待插入的位置和值:\n");
scanf("%d%d",&i,&e);
ListInsert(La,i,e);
printList(La);
CreateList2(Lb,n); // 逆位序输入n个元素的值
printf("Lb="); // 输出链表Lb的内容
printList(Lb);
printf("输入待删除的位置:\n");
scanf("%d",&i);
ListDelete(Lb,i,e);
printf("删除的元素值为:\n");
printf(" %d \n",e);
printf("Lb="); // 输出链表Lb的内容
printList(Lb);
}
重学数据结构 链表(工程文件)算法2.8 2.9 2.10 2.11
最新推荐文章于 2021-11-01 15:12:12 发布