1.实验目的及要求
通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。
2.实验主要仪器、设备和材料等
硬件:PC机
软件:Dev-C++、VC 6.0或CodeBlocks等。
3.实验内容(包括实验原理和操作步骤)
1、用头插法(或尾插法)建立带头结点的单链表;
2、对已建立的单链表实现插人、删除、查找和遍历等基本操作。
3、最好用菜单形式对应各个操作,使其编程一个完整的小软件。
参考界面:
最后附上代码:
#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;
//1.初始化链表
Status InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
//2.后插法创建链表
void CreateList(LinkList *L,int n)
{
LNode *p;
LNode *r;
int i;
(*L) = (LNode *)malloc(sizeof(LNode));
(*L)->next = NULL;
r = *L;
int a;
for(i=0;i<n;i++){
printf("请输入第%d位元素:",i+1);
scanf("%d",&a);
p = (LNode *)malloc(sizeof(LNode));
p->data = a;
r->next = p;
r = p;
}
r->next = NULL;
}
//3.查找某一位置的元素值
Status GetElem(LinkList L,int i,ElemType &e)
{
int j;
LinkList p;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return 0;
e=p->data;
return OK;
}
//4.查找链表中元素的位置
Status LocateElem(LinkList L,ElemType e)
{
LNode *p;
int i=1;
p=L->next;
while(p&&p->data!=e)
{
p=p->next;
i++;
}
return(i);
}
//5.在某一位置前插入一个元素
Status ListInsert(LinkList &L,int i,int e)
{
LNode *p,*s;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return 0;
s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//6.删除某一个元素
Status ListDelete(LinkList &L,int i)
{
int j=0;
LNode *p,*q;
p=L;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
return 0;
q=p->next;
p->next=q->next;
delete q;
return OK;
}
//7.遍历链表输出
Status ListTraverse(LinkList *L)
{
LNode *p, *q;
p = *L;//将头指针赋值给p
while(p->next != NULL){
q = p->next;
printf("%d\n", q->data);
p = p->next;
}
}
int n;
int e;
int main()
{
int code;
LinkList L;
while(1)
{
system("cls");
printf("***********************************************************\n");
printf("**** ****系统菜单**** ****\n");
printf("**** ****\n");
printf("**** * 1 初始化链表 * ****\n");
printf("**** * 2 输入链表元素 * ****\n");
printf("**** * 3 所指位序的元素值 * ****\n");
printf("**** * 4 链表已存在元素的位序 * ****\n");
printf("**** * 5 在第i个位置插入元素 * ****\n");
printf("**** * 6 删除第i个元素 * ****\n");
printf("**** * 7 输出所输入的链表元素 * ****\n");
printf("**** * 8 退出 * ****\n");
printf("**** ****\n");
printf("***********************************************************\n");
printf("请输入操作代码:");
scanf("%d",&code);
switch(code)
{
case 1:
{
int temp;
temp=InitList(L);
if(temp==OK)
{
printf("链表初始化成功!\n");
}else
{
printf("链表初始化失败!\n");
}
break;
}
case 2:
{
printf("请输入要输入的元素个数:");
scanf("%d",&n);
CreateList(&L,n);
break;
}
case 3:
{
int e,i;
printf("请输入你要查找的序号:");
scanf("%d",&i);
GetElem(L,i,e);
printf("你要查找的第%d位元素为:%d\n",i,e);
break;
}
case 4:
{
int e,temp;
printf("请输入要查找的元素:");
scanf("%d",&e);
temp=LocateElem(L,e);
printf("所查找的元素位序为:%d\n",temp);
break;
}
case 5:
{
int i,e,temp;
printf("请输入要插入的位序:");
scanf("%d",&i);
printf("请输入要插入的元素:");
scanf("%d",&e);
temp=ListInsert(L,i,e);
if(temp==OK)
printf("插入成功!\n");
else
printf("插入失败!\n");
break;
}
case 6:
{
int i,e,temp;
printf("请输入要删除的位序:");
scanf("%d",&i);
temp=ListDelete(L,i);
if(temp==OK)
printf("删除成功!\n");
else
printf("删除失败!\n");
break;
}
case 7:
{
ListTraverse(&L);
break;
}
case 8:
{
printf("程序结束!\n");
return 0;
break;
}
default:printf("数据无效,请重新输入!");
}
system("pause");
}
}