实验目的及要求:
1. 理解线性表的概念及特征、线性表顺序存储结构的含义及优势和缺点、线性表链式存储结构的含义及优势和缺点;
2. 理解线性表顺序存储方案(元素和关系如何存储)、线性表链式存储方案之一单链表存储方案(元素和关系的存储);
3. 理解线性表顺序存储结构的C语言定义、单链表存储结构的C语言定义;
4. 熟练掌握顺序表变量定义、顺序表初始化、建立、查找、定位、插入、删除合并等操作;单链表变量定义、单链表初始化、建立、查找、定位、插入、删除合并等操作。
5. 理解线性表链式存储其他存储方案,如:循环链表、双向链表的概念和C语言结构体定义。掌握在其上的常见操作。
6. 掌握单链表应用之一,一元一次多项式表示及相加问题。
实验内容:
任务一:顺序表操作练习
1. 编写算法:先输入线性表长度n,然后输入n个整数建立整数顺序表。在顺序表上练习①按值查找;②删除元素 的操作。
2. 编写算法:输入数个字符建立字符顺序表,在顺序表上练习①求表长度;②按序号查找;③插入元素 的操作。
任务二:线性链表练习
1. 编写算法 :先输入线性表长度n,然后输入n个整数利用头插法建立整数单链表。在单链表上练习①打印输出该单链表;②按序号查找;③删除元素。
2. 编写算法:输入数个字符利用尾插法建立字符单链表。在单链表上练习①打印输出该单链表;②输出单链表长度;③按值查找;④插入元素。
3. 【选做】编写算法:建立任意一元多项式的存储结构(采用单链表),并实现两个一元多项式相加操作。
程序代码:
任务一(1)
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;Status InitList(SqList* L,int max){
L -> elem = (ElemType *)malloc(max*sizeof(ElemType));
if(!L -> elem){
return ERROR;
}
L -> length = 0;
return OK;
}
Status ListDelete(SqList *L, int i, ElemType *e){
int k;
if(L->length == 0){
return ERROR;
}
if(i < 1 || i > L->length){
return ERROR;
}
*e = L -> elem[i-1];
if(i < L->length){
for(k = i;k < L->length;k++){
L->elem[k-1] = L->elem[k];
}
}
L->length--;
return OK;
}
int LocationElem(SqList L,int e){
for(int i=0;i<L.length;i++)
if(L.elem[i]==e)
return i+1;
return 0;
}
void OutPut(SqList L){
printf("当前顺序表的长度:%d\n", L.length);
for(int i = 0; i < L.length; i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}
Status ListInsert(SqList *L, int i, ElemType e,int max){
int k;
if (L->length == max){
return ERROR;
}
if (i < 1 || i > L->length+1){
return ERROR;
}
if (i <= L->length){
for(k = L->length-1;k >= i-1;k--){
L->elem[k+1] = L->elem[k];
}
}
L->elem[i-1] = e;
L->length++;
return OK;
}
int main()
{
int max;
SqList L;printf("输入一个线性表L的长度\n");
scanf("%d",&max);
InitList(&L,max);
OutPut(L);
printf("测试插入10个数\n");
for(int i = 1;i <= 10; i++){
ListInsert(&L,i,i,max);
}
OutPut(L);
printf("删除第6位的数据\n");
ElemType e;
ListDelete(&L,6,&e);
printf("删除的数据为:%d\n", e);
OutPut(L);
printf("获取元素操作\n");
int num;
num=LocationElem(L,7);
printf("在第%d个元素", num);
}
(2)
#include<stdio.h>
#include<stdlib.h>
#define max 20
#define OK 1
#define ERROR 0
typedef char Status;
typedef char ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;
Status InitList(SqList* L){
L -> elem = (ElemType *)malloc(max*sizeof(ElemType));
if(!L -> elem){
return ERROR;
}
L -> length = 0;
return OK;
}
void OutPut(SqList L){
printf("当前顺序表的长度:%d\n", L.length);
for(int i = 0; i < L.length; i++){
printf("%c ",L.elem[i]);
}
printf("\n");
}
Status ListInsert(SqList *L, int i, ElemType e){
int k;
if (L->length == max){
return ERROR;
}
if (i < 1 || i > L->length+1){
return ERROR;
}
if (i <= L->length){
for(k = L->length-1;k >= i-1;k--){
L->elem[k+1] = L->elem[k];
}
}
L->elem[i-1] = e;
L->length++;
return OK;
}
Status GetElem(SqList L, int i, ElemType *e){
if(L.length == 0 || i<1 || i>L.length){
return ERROR;
}
*e = L.elem[i-1];
return OK;
}
int main()
{
SqList L;
InitList(&L);
OutPut(L);
printf("测试插入10个数\n");
for(char i = 1;i <= 10; i++){
ListInsert(&L,i,i+'0');
}
printf("输出线性表L的长度\n");
OutPut(L);
printf("按序号查找\n");
ElemType e;
GetElem(L,5,&e);
printf("得到第5个元素:%c", e);
}
任务二(1)
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct Node
{
elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
return 0;
}
void CreateListHead(LinkList *L)
{
int i, n;
LinkList p;
(*L) = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
printf("请输入您要插入元素的个数:");
scanf("%d", &n);
printf("请输入你要插入的元素值(用空格隔开):");
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
scanf("%d", &p->data);
p->next = (*L)->next;
(*L)->next = p;
}
}
int GetElem(LinkList L, int i, elemtype *e)
{
int j = 1;
LinkList p;
p = L->next;
while (p && j < i)
{
p = p->next;
++j;
}
if (!p || j > i)
{
printf("查询不到该元素!\n");
return 0;
}
*e = p->data;
return 0;
}
int DeleteList(LinkList *L, int i, elemtype *e)
{
LinkList p, q;
int j = 1;
p = *L;
while (p->next && j < i)
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
{
printf("删除元素失败!\n");
return 0;
}
q = p->next;
p->next = q->next;
*e = q->data;
free(q);
return 0;
}
void ShowList(LinkList *L)
{
LinkList p;
p = (*L)->next;
if (p == NULL)
{
printf("这是一个空链表!\n");
}
printf("单链表");
while (p)
{
printf(" -> %d", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkList L;
InitList(&L);
int k,i;
elemtype m ;
CreateListHead(&L);
ShowList(&L);
int text;
printf("请输入查询的序号\n");
scanf("%d",&text);
GetElem(L, text, &m);
printf("得到的元素值为:%d\n", m);
int text2;
printf("请输入想删除元素的序号\n");
scanf("%d",&text2);
DeleteList(&L, text2, &m);
printf("删除元素后的");
ShowList(&L);
printf("删除的元素值为:%d\n", m);
system("pause");
return 0;
}
(2)
#include<stdio.h>
#include<stdlib.h>
typedef char elemtype;
typedef struct Node
{
elemtype data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)//链表初始化
{
(*L) = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
return 0;
}
void CreateListTail(LinkList *L) {
int i, n;
LinkList p,r;
(*L) = (LinkList)malloc(sizeof(Node));
r = *L;
printf("请输入您要的元素的个数:");
scanf("%d", &n);
printf("请输入你要插入的元素值(用空格隔开):");
for (i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(Node));
scanf("%c", &p->data);
r->next = p;
r = p;
}
r->next = NULL;
}
int GetElem(LinkList L, char ch, elemtype *e)
{
int j = 1;
LinkList p;
p = L->next;
while(p){
if(ch == p->data){
return j;
}
p = p->next;
++j;
}
return 0;
}
void ShowList(LinkList *L)
{
LinkList p;
p = (*L)->next;
if (p == NULL)
{
printf("这是一个空链表!\n");
}
printf("单链表");
while (p)
{
printf(" -> %c", p->data);
p = p->next;
}
printf("\n");
}
int InsertList(LinkList *L, int i, elemtype e)
{
LinkList p, s;
int j = 1;
p = *L;
while (p && j < i)
{
p = p->next;
++j;
}
if (!p || j > i)
{
printf("插入元素失败!\n");
return 0;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return 0;
}
int LengthList(LinkList *L)
{
int length = 0;
LinkList p;
p = (*L)->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
int main()
{
LinkList L;
InitList(&L);
int k,i;
elemtype m ;
CreateListTail(&L);
ShowList(&L);
printf("单链表的长度为%d\n", LengthList(&L));
char text1;
getchar();
scanf("%c",&text1);
printf("得到的元素位置为:%d \n", GetElem(L, text1, &m));
int text2;
printf("请输入想插入的位置");
scanf("%d",&text2);
getchar();
printf("请输入插入的元素");
elemtype text3;
scanf("%c",&text3);
InsertList(&L,text2,text3 );
printf("插入元素后的");
ShowList(&L);
system("pause");
return 0;
}