一.实验目的
熟悉线性表的链式存储结构,熟练掌握线性表各种基本操作的实现,培养灵活运用线性表解决实际问题的能力。
二.实验题目
键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,在单向链表中删除元素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;
- }