一.实验目的
熟悉线性表的链式存储结构,熟练掌握线性表各种基本操作的实现,培养灵活运用线性表解决实际问题的能力。
二.实验题目
键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,在单向链表中删除元素E,然后将单向链表逆置,设计一个MAIN()函数,分别调试上述算法。
对于单向链表的建立可以有两种方式选择,一种是从头结点后面依次插入,一种是从尾结点后面依次插入,可以根据实际需要选择这两种方法之一实现。
单向链表的逆置要求不增加新的存储空间,只是在原来已有链表的基础上进行逆置,而不是构造一个新的链表,将元素逆向插入到新的链表实现逆置功能。
三.实现提示
1. 数据的存储结构选择链表,链表的每个结点的定义如下。
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
2. 线性链表的逆置操作可以参照下图,本图给出了一个结点逆置的过程,至少需要两个中间指针完成这个工作:
四.思考及选做
1.如何使用顺序表实现本实验提出的要求。
2.比较顺序表和单向链表的优缺点。
3.线性链表的逆置如何能拿递归算法实现。
五.实现#include<stdio.h>
#include<stdlib.h>
/*
数据结构定义
*/
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
/*
创建链表
*/
LNode * creat(LNode *head)
{
int n = 0;
LNode *p1, *p2;
p1 = p2 = (LNode *)malloc(sizeof(LNode));
if(p1 == NULL)
{
printf("分配存储空间失败!");
return 0;
}
printf("请输入整数,输入0结束:\n");
scanf("%d", &(p1->data));
while(p1->data != 0)
{
n++;
if(n == 1)
{
head->next = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
p1 = (LNode *)malloc(sizeof(LNode));
if(p1 == NULL)
{
printf("分配存储空间失败1!");
exit(1);
}
scanf("%d", &(p1->data));
}
p2->next = NULL;
return head;
}
/*
删除表中第i个元素
*/
LNode * DeleteList(LNode *L,int i)
{
LNode *p=L,*q;
ElemType e;
int j=0;
//遍历线性表L,找到第i个节点,并让p指向他的前驱
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
//判断找的p的位置是否合理
//if(!(p->next)||j>i-1)return -1;
q=p->next;
p->next=q->next;
e=q->data;
printf("删除的是第%d个元素%d\n",i,e);
free(q);
return p;
}
/*
将链表反序。
*/
LNode * reverseOrderList(LNode *head)
{
LNode *p1, *p2, *p3, *p4;
p4 = head;
p1 = head->next;
p2 = p1->next;
p3 = p2->next;
for( ; p3 != NULL; )
{
if(p3->next == NULL)
{
p3->next = NULL;
}
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p3->next;
}
p2->next = p1;
p1 = p2;
p4->next->next = NULL;
p4->next = p1;
return (p4);
}
/*
打印输出链表
*/
void print(LNode *d)
{
LNode *p;
p = d->next;
for(;p != NULL;p = p->next)
{
printf("%d ", p->data);
}
printf("\n");
}
/*
main函数
*/
int main()
{
LNode data, *head;
LNode *h;
//创建
head = creat(&data);
//删除第一个
DeleteList(head,0);
print(head);
//反序
h = reverseOrderList(head);
print(h);
return 0;
}