线性表的链式存储结构
实验
[实验目的]
掌握线性表链式存储的基本操作,能根据实际问题选择存储结构。
[实验内容]
(1)单链表的初始化操作
(2)单链表的插入
(3)单链表的输出
(4)单链表的删除
[具体实现]
(1)删除字母表中的元素
(2)将2个有序的单链表合并为一个有序的单链表
LinkList.h
//LinkList.h
typedef int ElemType;
typedef struct SingleNode
{
ElemType data;
struct SingleNode *next;
}SingleLinkedList;
void ListInitialize(SingleLinkedList **head);//初始化链表
int ListLength(SingleLinkedList *head); //获得链表长度
int ListGet(SingleLinkedList *head ,int i ,ElemType *x);//取序号为i的数据元素的值
int ListInsert(SingleLinkedList *head, int i, ElemType x); //在带头结点的单链表head的数据元素ai(0<=i<=size)结点前,插入一个存放数据元素x的节点
int ListDelete(SingleLinkedList *head, int i, ElemType *x); //删除序号为i的元素,删除元素的值给x
void ListDestroy(SingleLinkedList **head);//释放内存
void ListAssign(SingleLinkedList *head); //输入链表初始元素
void ListPrint(SingleLinkedList *head); //列表完整输出
void ListSort(SingleLinkedList *head); //列表从小到大排序成顺序列表
void ListConnect(SingleLinkedList *head1,SingleLinkedList *head2,SingleLinkedList *head3); //连接两个链表并排序为顺序链表
LinkList.cpp
//LinkList.cpp
#include "stdlib.h" //#include "malloc.h"
#include "LinkList.h"
#include "stdio.h"
void ListInitialize(SingleLinkedList* *head) //初始化链表
{
*head = (SingleLinkedList *)malloc(sizeof(SingleLinkedList));
if( *head == NULL )
exit(1);
(*head)->next = NULL;
}
int ListLength(SingleLinkedList *head) //获得链表长度
{
SingleLinkedList *p = head;
int size = 0;
while(p->next != NULL)
{
p = p->next;
size++;
}
return size;
}
int ListGet(SingleLinkedList *head,int i, ElemType *x) //取序号为i的数据元素的值
{
SingleLinkedList *p;
p = head;
int j;
j = -1;
while(p->next != NULL && j<i)
{
p = p->next;
j++;
}
if(j != i)
{
printf("Error in getting element position parameter!!\n");
return 0;
}
*x = p->data;
return 1;
}
int ListInsert(SingleLinkedList *head, int i, ElemType x)
/*在带头结点的单链表head的数据元素ai(0<=i<=size)结点前*/
/*插入一个存放数据元素x的节点*/
{
SingleLinkedList *p,*q;
p = head;
int j;
j = -1;
while(p->next != NULL && j<i-1)
{
p = p->next;
j++;
}
if(j!=i-1)
{
printf("Error in inserting position parameter!!\n");
return 0;
}
q = (SingleLinkedList *)malloc(sizeof(SingleLinkedList));
if(q==NULL)
exit(1);
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
int ListDelete(SingleLinkedList *head, int i, ElemType *x) //删除序号为i的元素,删除元素的值给x
{
SingleLinkedList *p,*s;
int j;
p = head;
j = -1;
while(p->next!=NULL && p->next->next!=NULL && j<i-1)
{
p = p->next;
j++;
}
if(j!=i-1)
{
printf("Error in deleting position!!\n");
return 0;
}
s = p->next;
*x = s->data;
p->next = s->next;
free(s);
return 1;
}
void ListDestroy(SingleLinkedList **head) //释放内存
{
SingleLinkedList *p,*p1;
p = *head;
while (p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}
void ListAssign(SingleLinkedList *head) //输入链表初始元素
{
int x;
printf("请输入需要插入的元素,按CTRL+Z结束\n");
while(scanf("%d",&x)!=EOF)
{
ListInsert(head,0,x);
}
ListPrint(head);
}
void ListPrint(SingleLinkedList *head) //列表完整输出
{
SingleLinkedList *p;
p = head->next;
printf("The Link is : ");
for( ; p!=NULL ; )
{
printf("%d ",p->data);
p = p->next;
}
putchar(10);
}
void ListSort(SingleLinkedList *head) //列表从小到大排序成顺序列表
{
int N;
N = ListLength(head);
SingleLinkedList *p,*q;
p = head->next;
q = p->next;
int i,j;
i = -1;
while(p!=NULL && i<N)
{
j = i;
q = p->next;
while(q !=NULL && j<N)
{
if(p->data > q->data)
{
ElemType temp;
temp = p->data;
p->data = q->data;
q->data = temp;
}
q = q->next;
j++;
}
p = p->next;
i++;
}
}
void ListConnect(SingleLinkedList *head1,SingleLinkedList *head2,SingleLinkedList *head3) //连接两个链表并排序为顺序链表
{
int N1,N2;
N1 = ListLength(head1);
N2 = ListLength(head2);
SingleLinkedList *p,*q;
p = head1->next;
q = head2->next;
int i;
i = 0;
while(p!=NULL && i<N1)
{
ListInsert(head3,0,p->data);
p = p->next;
i++;
}
i = 0;
while(q!=NULL && i<N2)
{
ListInsert(head3,0,q->data);
q = q->next;
i++;
}
ListSort(head3);
}
LinkListPrj.cpp
//LinkListPrj.cpp
#include "stdio.h"
#include "LinkList.h"
void main()
{
/*字母表删除元素操作*/
int d;
SingleLinkedList *head;
ListInitialize(&head);
for(int i=0;i<26;i++)
{
ListInsert(head,i,97+i);
}
printf("请输入需要删除的元素序号\n");
scanf("%d",&d);
int x;
ListDelete(head,d,&x);
printf("已经删除的元素是%c\n",x);
printf("剩余的元素是:\n");
for(i=0;i<ListLength(head);i++)
{
ListGet(head,i,&x);
printf("%c ",x);
}
putchar(10);
ListDestroy(&head);
putchar(10);
/*链表连接排序*/
SingleLinkedList *link1,*link2;
ListInitialize(&link1);
ListInitialize(&link2);
printf("设置link1的元素\n");
ListAssign(link1);
printf("设置link2的元素\n");
ListAssign(link2);
SingleLinkedList *link3; //用link3接收链接之后的链表
ListInitialize(&link3);
ListConnect(link1,link2,link3);
printf("链接之后的链表\n");
ListPrint(link3);
ListDestroy(&link1);
ListDestroy(&link2);
ListDestroy(&link3);
}
输出示例
请输入需要删除的元素序号
8
已经删除的元素是i
剩余的元素是:
a b c d e f g h j k l m n o p q r s t u v w x y z
设置link1的元素
请输入需要插入的元素,按CTRL+Z结束
12 34 52 6 2 100 7
^Z
The Link is : 7 100 2 6 52 34 12
设置link2的元素
请输入需要插入的元素,按CTRL+Z结束
15 96 44 1 8
^Z
The Link is : 8 1 44 96 15
链接之后的链表
The Link is : 1 2 6 7 8 12 15 34 44 52 96 100
Press any key to continue