实验二 线性表的链式存储结构


实验

[实验目的]
掌握线性表链式存储的基本操作,能根据实际问题选择存储结构。
[实验内容]
(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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值