一、实验目的和要求
1)掌握使用CodeBlooks软件上机调试程序的基本方法;
2)掌握单链表的基本操作:初始化、插入、删除、定位数据元素等运算;
3)用C++语言定义描述单链表的结构体;
二、实验原理
单链表的基本操作:单链表结构体的定义,单链表操作:初始化、插入、删除、获得数据元素运算。
三、主要仪器设备或材料
PC机,Windows XP操作平台,CodeBlooks
四、实验方法和步骤
1、利用CodeBlooks新建C++项目
2、编写程序
#include "stdio.h"
#include "malloc.h"
typedef int DataType;
typedef struct LNode {
DataType data; // 数据域
struct LNode *next; // 指针域
} LNode, *LinkList;
//初始化算法描述
void initList(LinkList &L) {
L = (LNode *)malloc(sizeof( LNode ) );
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //头结点为空
}
//单链表的查找(按位查找)
LNode *Locate(LinkList L, int i) {
LNode *head;
head = L;
int count = 0;
if (i <= 0) {
printf("Locate函数执行,i值非法\n");
return NULL;
}
while ( head->next != NULL ) {
if (count < i) {
count++; //和++
head = head->next; //头结点的移动
} else
break;
}
if (i == count) {
printf("\n函数执行,链表中的第%d个元素的值时%d,count=%d", i, head->data, count);
return head;
} else
return NULL;
}
//单链表的查找(按值查找)
LNode *LocateKey(LinkList L, DataType key) {
LNode *head;
head = L;
int count = 0;
if (NULL == head) {
printf("Locate函数执行,链表为空\n");
return NULL;
}
while ( head->next != NULL && head->data != key) {
count++; //和++
head = head->next; //头结点的移动
}
if (head->data == key) {
printf("\n函数执行,元素%d时链表中的第%d个元素\n", key, count);
return head;
} else
printf("链表中没有找到元素%d", key);
return NULL;
}
//单链表的插入
LinkList insertheadList (LinkList L, int i, DataType key) {
LNode *p = L, *s;
int j = 1;
if (i <= 0) {
printf("insertheadList函数执行,i值非法,插入失败\n");
return NULL;
}
//找到第i的位置
while ((p->next != NULL) && (j < i)) {
p = p->next;
j++;
}
if (j != i) {
printf("\n insertheadList函数执行,i值超过链表长度,插入失败\n");
return NULL;
} else {
s = (LNode *)malloc(sizeof(LNode));
s->data = key; //赋值key
s->next = p->next;
p->next = s; //单链表的插入代码
printf("\n insertheadList函数执行,在第%d个位置插入%d,插入成功\n", i, key);
}
return L;
}
//单链表的删除
LNode *DelLink(LinkList L, int i) {
LNode *p, *q;
int j = 1;
p = L;
if (i < 1) {
printf("删除结点位置不合法,删除失败\n");
}
while ((p->next != NULL) && (j < i)) {
p = p->next;
j++;
}
if (j != i) {
printf("\n DelLink函数执行,i值超过链表长度,插入失败\n");
return L;
} else {
q = p->next; //指针指向下一个结点
p->next = q->next; //删除代码
printf("删除第%d个结点成功,删除的结点值是%d\n", i, q->data);
free(q); //释放
}
return L;
}
int main() {
LinkList LL;
initList(LL);
//单链表的插入
LL = insertheadList(LL, 1, 11); //在单链表LL第1个位置插入11
LL = insertheadList(LL, 2, 12); //在单链表LL第2个位置插入12
LL = insertheadList(LL, 3, 13); //在单链表LL第3个位置插入13
LL = insertheadList(LL, 4, 14); //在单链表LL第4个位置插入14
LL = insertheadList(LL, 5, 15); //在单链表LL第5个位置插入15
LNode *p = Locate(LL, 2);
p = LocateKey(LL, 13);
LL = DelLink(LL, 2);
Locate(LL, 2);
return 1;
}