数据结构实验
实验二、单链表(2学时)
1.设计实验 设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。(1-4题必做,5-8题选做)具体实现要求: (1)用正位序的方法,建立一个由13个整数构成的带头结点的单链表。建议13个整数由键盘输入。
(2)从键盘输入1个整数,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则,则显示“找不到”。
(3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
(4)从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
*(5)将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
*(6)删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
*(7)把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。
*(8)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
以下是我实现1-4的代码:
#include <stdafx.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
typedef struct linkedlist //定义单链表结构体
{
int data;
linkedlist *next;
}linkedlist,*linklist; //定义单链表实例linkedlist和*next
int initList(linklist &list) //创建单链表的方法
{
list=(linklist)malloc(sizeof(linkedlist)); //动态分配空间
list->next=NULL; //声明指针
return OK;
}
int insertList(linklist &list,int i,int e) //在单链表中第i位置插入元素e
{
linklist L=list,s;
for(int j=0;j<i-1;j++)
{
if (L->next==NULL) return ERROR; //判断插入的位置是否超出链表长度,超出返回ERROR
L=L->next; //根据链的指针往下一个走
} //将指针直到插入位元素
s=(linklist)malloc(sizeof(linkedlist)); //添加新元素
s->data=e;
s->next=L->next; //s.next指向下一个元素
L->next=s; //L.next指向s,实现s的插入
return OK;
}
int findifElem(linklist &list,int i) //查找链表list中是否存在元素i
{
linklist L=list;
while(L!=NULL) //用while语句实现遍历
{
if (L->data == i) return TURE; //找到了元素i,返回TURE
L=L->next; //查找下一个
}
return FALSE; //没有找到元素,返回FALSE
}
int displayList(linklist &list) //输出链表list中的所有元素
{
linklist L=list->next; //更改初始位置到第一个元素
while (L!=NULL)
{
printf("%d ",L->data);
L=L->next;
} //循环输出值,直到最后一个
printf("\n");
return OK;
}
int deleteElem(linklist &list,int i) //删除链表list中的第i位元素
{
linklist L=list,s;
for (i;i!=1;i--) //将指针移到第i-1位元素上
{
L=L->next;
if (L==NULL) return ERROR; //如果i超出了链表的长度,返回ERROR
}
s=L->next; //用s记录第i位元素的值
L->next=s->next; //将i-1位的指针直接指到原第i+1位元素上
free(s); //释放s
return OK; //成功则返回OK
}
int main()
{
linklist h;
initList(h);
int n,x;
printf("依次输入13个元素\n");
for (int i=1;i<=13;i++)
{
insertList(h,i,i);
}
displayList(h);
printf("\n请输入要查找的元素:");
scanf("%d",&x);
if (findifElem(h,x)) printf("\n找到了");
else printf("\n没找到");
printf("\n请输入要插入的位数和数字(空格隔开):");
scanf("%d %d",&n,&x);
if (!insertList(h,n,x)) printf("输入位数不合法.\n");
displayList(h);
printf("\n请输入要删除的位数:");
scanf("%d",&n);
if(!deleteElem(h,n)) printf("输入位数不合法.\n");
displayList(h);
return OK;
}