1.h文件
#include<stdio.h>
#include<malloc.h>
//结点类型声明
typedef int ElemType;
struct LinkNode{
ElemType Elem;
LinkNode *Next;
};
// 创建一个链表结点
LinkNode *LinkCreateNode(ElemType Elem) {
LinkNode *node = (LinkNode *) malloc ( sizeof(LinkNode) );
node->Elem = Elem;
node->Next = NULL;
return node;
}
//结点类型声明
//typedef struct Node{
// ElemType Elem;
// struct Node *Next;
//}LinkNode,*LinkList;
//初始化
void InitList(LinkNode *&L){
L=(LinkNode*)malloc(sizeof(LinkNode));
L->Next=NULL;
}
//销毁
void DestroyList(LinkNode *&L){
LinkNode *pre=L,*p=L->Next;
while(p!=NULL){
free(pre);
pre=p;
p=pre->Next;
}
free(pre);
}
//判断是否为空
bool EmptyList(LinkNode *L){
return (L->Next==NULL);
}
//求长度
int ListLength(LinkNode *L){
int n=0;
LinkNode *p=L;
while(p->Next!=NULL){
n++;
p=p->Next;
}
return (n);
}
//输出
void DispList(LinkNode *L){
LinkNode *p=L->Next;
while(p!=NULL){
printf("%d ",p->Elem);
p=p->Next;
}
printf("\n");
}
//求数据元素值
bool GetElem(LinkNode *L,ElemType i,ElemType &e){
int j;
LinkNode *p=L;
for(j=0;j<i;j++){
p=p->Next;
e=p->Elem;
}
if(p==NULL)
return false;
else
return e;
}
//按值查找元素
int LocateElem(LinkNode *L,ElemType e){
int n=0;
LinkNode *p=L;
while(p->Elem!=e&&p!=NULL){
n++;
p=p->Next;
}
if(p==NULL)
return 0;
else
return (n);
}
//头插法
void CreateListF(LinkNode *&L,ElemType a[],int n){
LinkNode *s;
L=(LinkNode *)malloc(sizeof(LinkNode));
L->Next=NULL;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->Elem=a[i];
s->Next=L->Next;
L->Next=s;
}
}
//尾插法
void CreateListR(LinkNode *&L,ElemType a[],int n){
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode));
r=L;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->Elem=a[i];
r->Next=s;
r=s;
}
r->Next=NULL;
}
//删除
int ListDeleteNode(LinkNode *&L,int i){
LinkNode *p=L,*q;
int j=0;
for(int j=0;j<i-1;j++){
p=p->Next;
}
if(!(p->Next)||(j>i-1))
return 0;
q=p->Next;
p->Next=q->Next;
free(q);
return 1;
}
//插入
bool ListInsert(LinkNode *&L,int i,ElemType e){
int j=1;
LinkNode *p=L->Next,*s;
while(j<i-1&&p!=NULL){
p=p->Next;
j++;
}
if(p==NULL)
return false;
else{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->Elem=e;
s->Next=p->Next;
p->Next=s;
return true;
}
}
//插入
//LinkNode *ListInsertNode(LinkNode *head, int i, ElemType v) {
// LinkNode *pre, *aft, *vtx; // (1) 插入完毕后, pre -> vtx -> aft
// int j = 0; // (2) 定义一个计数器,当 j == i 时,表明找到要插入的位置
// pre = head; // (3) 从链表头开始
// while(pre && j < i) { // (4) 如果还没有到链表尾,或者没有找到插入位置则继续循环
// pre = pre->Next; // (5) 游标指针指向它的后继结点
// ++j; // (6) 计数器加 1
// }
// if(!pre) {
// return NULL; // (7) 元素个数不足,无法找到给定位置,返回 NULL
// }
// vtx = LinkCreateNode(v); // (8) 创建一个值为 v 的鼓孤立结点
// aft = pre->Next; // (9) - (11) 为了串成 pre -> vtx -> aft
// vtx->Next = aft; // (10)
// pre->Next = vtx; // (11)
// return vtx; // (12) 返回插入的那个结点
//}
//删除
//LinkNode *ListDeleteNode(LinkNode *head, int i) {
// LinkNode *pre, *del, *aft;
// int j = 0;
// if(head == NULL) {
// return NULL; // (1) 空链表,无法执行删除,直接返回
// }
// if(i == 0) { // (2) 需要删除链表第 0 个结点
// del = head; // (3) 缓存第 0 个结点
// head = head->Next; // (4) 将新的链表头结点变为当前头结点的后继结点
// free(del); // (5) 调用系统库函数 free 释放内存
// return head; // (6) 返回新的链表头结点
// }
//
// pre = head; // (7) 执行链表结点的游走
// while(pre && j < i - 1) { // (8) 找到将要被删除结点的前驱结点
// pre = pre->Next;
// ++ j;
// }
// if(!pre || !pre->Next) { // (9) 如果前驱结点为空,或者需要被删除的结点为空,则直接返回当前链表头
// return head;
// }
// del = pre->Next; // (10) 缓存需要删除的结点到 del
// aft = del->Next; // (11) 缓存删除结点的后继结点到 aft
// pre->Next = aft; // (12) 将需要删除的结点的前驱结点指向它的后继结点
// free(del); // (13) 释放需要删除结点的内存空间
// return head; // (14) 返回新的链表头结点
//}
.cpp文件
#include<stdio.h>
#include"1.h"
int main(){
LinkNode *L;
printf("(1)初始化线性表\n");
InitList(L);
ElemType a[]={8,10,12,16,18};
CreateListR(L,a,5);
printf("(3)输出线性表:\n");
DispList(L);
printf("(4)表长度为:%d\n",ListLength(L));
printf("(5)判断表为:%s\n",EmptyList(L)?"空":"非空");
ElemType e;
GetElem(L,5,e);
printf("(6)第5个元素为:%d\n",e);
printf("(7)输出元素16的位置为:%d\n",LocateElem(L,16));
ListInsert(L,5,14);
printf("(8)在第5个元素的位置插入14这个元素\n");
printf("(9)输出表");
DispList(L);
printf("(10)删除第5个元素\n");
ListDeleteNode(L,5);
printf("(11)输出表");
DispList(L);
}
运行结果:
(1)初始化线性表
(3)输出线性表:
8 10 12 16 18
(4)表长度为:5
(5)判断表为:非空
(6)第5个元素为:18
(7)输出元素16的位置为:4
(8)在第5个元素的位置插入14这个元素
(9)输出表8 10 12 16 14 18
(10)删除第5个元素
(11)输出表8 10 12 16 18
--------------------------------
Process exited after 0.2504 seconds with return value 0
请按任意键继续. . .