实验目的: 掌握线性表的顺序存储结构和链式存储结构设计与其它操作的实现 实验内容: 1、采用线性表动态分配顺序存储结构,编程实现顺序表中数据元素的逆置操作。 2、有一个带头结点的线性链表 L,编程实现链表中数据元素的逆置操作。要求不另设新结点。 3、采用线性表动态分配顺序存储结构,编程实现顺序表中数据元素按值非递减排列。 4、有一个带头结点的线性链表 L,编程实现链表中数据元素按值非递减排列。要求不另设新结点。 程序清单: 1. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 0 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; }LNode, * linklist; //从表尾到表头逆向创建n个元素的单链表 void createlistl(linklist& l, int n) { int i; linklist p; l = (linklist)malloc(sizeof(LNode)); l->next = NULL; for (i = n; i > 0; --i) { p = (linklist)malloc(sizeof(LNode)); scanf("%d" ,& p->data); p->next = l->next; l->next = p; } } //输出单链表 Status outputlistl(linklist l) { linklist p = l->next; if (!p) return ERROR; while (p!=NULL ) { printf(" %d", p->data); p = p->next; } printf("\n"); return OK; } Status geteleml(linklist& l, int i, ElemType& e) { linklist p; int j; p = l->next; j = 1; while (p && j < i) { p = p->next; ++j; } if (!p || j > i) return ERROR; e = p->data; return OK; } Status listinsertl(linklist& l, int i, ElemType e) { int j; linklist p, s; p = l; j = 0; while (p && j < i - 1) { p = p->next; ++j; } if (!p || j > i - 1) return ERROR; s = (linklist)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return OK; } Status listdeletel(linklist& l, int i, ElemType& e) { int j; linklist p,q; p = l; j = 0; while (p->next && j < i - 1) { p = p->next; ++j; } if (!(p->next) || j > i - 1) return ERROR; q = p->next; p->next = q->next; e = q->data; free(q); return OK; } int main() { ElemType b, d, dd; linklist l; printf("创建单链表,输入5个元素:\n"); createlistl(l, 5); printf("输出单链表所有元素!\n"); outputlistl(l); printf("输出单链表第2个位置元素到dd!\n"); geteleml(l, 2, dd); printf("dd=%d\n", dd); printf("插入元素b:"); scanf("%d", &b); printf("在单链表第4个位置插入%d!\n", b); listinsertl(l, 4, b); printf("输出插入操作后单链表所有元素!\n"); outputlistl(l); printf("删除单链表第3个位置的元素!\n"); listdeletel(l, 3, d); printf("输出删除操作后单链表所有元素!\n"); outputlistl(l); } 2. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h > #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; } LNode, * LinkList; //Create the linked list L with n elements from head to rear void CreateList_L(LinkList& L, int n) { LinkList p, q; int i; L = (LinkList)malloc(sizeof(LNode)); q = L; srand(time(0)); for (i = 1; i <= n; i++) { p = (LinkList)malloc(sizeof(LNode)); p->data = rand() % 90 + 10; q->next = p; q = q->next; } q->next = NULL; } // CreateList_L //Output the linked list Status OutputList_L(LinkList L) { LinkList p = L->next; if (p == NULL) return ERROR; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf(" \n"); return OK; } //Data elements of the linked list are converse Status ListConverse_L(LinkList& L) { LinkList p, q; p = L->next; L->next = NULL; while (p != NULL) { q = p; p = p->next; q->next = L->next; L->next = q; } return OK; } // ListConverse_L int main() { LinkList L; printf("Create the linked list,"); CreateList_L(L, 5); printf("Output all elements of the linked list!\n"); OutputList_L(L); ListConverse_L(L); printf("Output all converse elements of the linked list!\n"); OutputList_L(L); return 0; } 3. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #define ADD 10 typedef struct { int* elem; int length; int listsize; }List; int CreatList(List& L, int n) { L.elem = (int*)malloc(n * sizeof(int)); L.length = n; L.listsize = n; int i; for (i = 0; i < n; i++) scanf("%d", &L.elem[i]); return 0; } void sortList(List& L) { int* p; int* q; int* end; int i = 0; int temp; end = L.elem + L.length - 1; for (i = 0; i < L.length; i++) { p = &(L.elem[i]); for (q = &(L.elem[i]); q <= end; q++) if (*q < *p) { temp = *q; *q = *p; *p = temp; } } } void printfList(List& L) { int i = 0; for (i = 0; i < L.length; i++) printf("%d ", L.elem[i]); return; } int main() { List L; printf("请输入10个线性表中的元素:"); CreatList(L, 10); sortList(L); printf("\n输出排序后的顺序表:"); printfList(L); return 0; } 4. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef struct LNode { int data; struct LNode* next; }LNode, * List; void CreatList(List& L, int n) { List p; List q; int i; L = (List)malloc(sizeof(LNode)); L->next = NULL; p = L; for (i = 0; i < n; i++) { q = (List)malloc(sizeof(LNode)); scanf("%d", &q->data); p->next = q; p = p->next; } p->next = NULL; } void sortList(List& L, int n) { List p; List q; int i, j, k; int temp; q = p = L->next; for (i = 0; i < n; i++) { q = p; for (j = i; j < n; j++) { if (q->data < p->data) { temp = q->data; q->data = p->data; p->data = temp; } q = q->next; } p = p->next; } } void printfList(List& L) { List p; p = L; while (p->next) { p = p->next; printf("%d ", p->data); } } int main() { List L; printf("请输入10个链表元素:"); CreatList(L, 10); printf("\n输出排序后的链表:"); sortList(L, 10); printfList(L); return 0; } 运行情况: 1. 2. 3. 4. 实验体会: 这次的程序设计,让我对标准内存分配函数:malloc,calloc,realloc有了更深刻的认识, 他们的作用都是动态分配内存。但与此同时,他们也有一些区别: malloc与calloc的区别为1块与n块的区别: malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 realloc调用形式为(类型*)realloc(ptr,size):将ptr内存大小增大到size。 除此之外,运用完内存后还要进行释放,这就需要用到free函数。 free的调用形式为free(voidptr):释放ptr所指向的一块内存空间。 |
03 线性表的存储和其它操作
最新推荐文章于 2024-07-24 17:46:08 发布