数据结构----线性表的应用

来源:互联网 发布:unity3d guilayout 编辑:程序博客网 时间:2024/04/29 08:29

一.实验目的

    熟悉线性表的链式存储结构,熟练掌握线性表各种基本操作的实现,培养灵活运用线性表解决实际问题的能力。

二.实验题目

键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,在单向链表中删除元素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; }


原创粉丝点击