数据结构实验二---单链表的实现

一、【实验目的】
1、掌握建立单链表的基本方法。

2、掌握单链表的插入、删除算法的思想和实现

二、【实验内容】

仿照教材中的单链表实现例子,自己设计一个有序单链表,单链表中的数据元素为整型并递增有序。有序单链表的定义:

逻辑结构:有序线性表,数据元素递增有序

存储结构:链式

操作集合:初始化、插入、删除、撤销

(1)ListInitiate(L) 初始化线性表,生成一个空表L。

(2)ListInsert(L,x) 在有序表L中插入数据元素x,使得新表仍然有序。

(3)ListDelete(L,x) 删除有序表L中的数据元素x,若删除成功则返回1,不成功则返回0。

(4)Destroy(L) 撤销单链表

要求:

1.有序单链表的操作集合有如下操作:初始化、插入、删除、撤销,使用头文件单链表的代码。

2.编写主函数main()验证所设计的有序单链表是否能正确插入、删除。

提示:

1.插入操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data小于等于x时,进行下一个结点的比较;否则就找到了插入结点的合适位置,此时申请新结点把x存入,然后把新结点插入;当比较到最后一个结点仍有data小于等于x时,则把新结点插入单链表尾。

2.删除操作时,从链表的第一个数据元素结点开始,逐个比较每个结点的data域值和x的值,当data不等于x时,进行下一个结点的比较;否则就找到了要删除的结点,删除结点后释放结点。如果到了表尾还没有找到值为x的结点,则链表中没有要删除的元素。

源代码

头文件
typedef struct SingleNode
{
	ElemType data;
	struct SingleNode *next;
}SingleLinkedList;

void ListInitiate(SingleLinkedList **head)
{
	if((*head = (SingleLinkedList*)malloc(sizeof(SingleLinkedList)))==NULL)
		exit(1);
		(*head)->next = NULL;
}

void ListInsert(SingleLinkedList *head,ElemType x)
{
	SingleLinkedList *p, *q,*h;
	p = head->next;
	q = head;
	while(p!=NULL&&p->data <=x)
	{
		q = p;
		p = p->next;
	}
	h = (SingleLinkedList*)malloc(sizeof(SingleLinkedList));
	h-> data = x;
	h->next = q->next;
	q->next = h; 
}

int ListDelete(SingleLinkedList *head,ElemType x)
{
	SingleLinkedList *p, *q;
	p = head;
	while(p->next!= NULL)
	{
		if(p->next->data == x)
		{
		break;
		}
		p=p->next;
		
	}
	if(p->next == NULL)
		return 0;
	else
	{
		q=p->next;
		p->next = p->next->next;
		free(q);
		return 1;
	}

		
}

void Destroy(SingleLinkedList **head)
{
	SingleLinkedList *p, *q;
	p = *head;
	while(p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
	*head = NULL;
}

int listlength(SingleLinkedList *head)
{
	SingleLinkedList *p=head;
	int size = 0;
	while(p->next!=NULL)
	{
		p=p->next;
		size++;
		
	}
	return size;
}


源文件
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
#include"LinkedList.h"

int main(void)
{
	SingleLinkedList *head,*p;
	ListInitiate(&head);
	int x,n,i,s,t,m;
	printf("请选择输入多少个数字:");
	scanf("%d",&n);
	for(i = 0;i < n;i++)
	{
		printf("第%d个数字是:",i+1);
		scanf("%d",&x);
		ListInsert(head,x);
				 
	}
	p=head;
	for(i = 0;i < n;i++)
	{
		printf("%5d",p->next->data);
		p=p->next;
	}
	
	printf("\n输入你要删除的数字:");
	scanf("%d",&s);
	
	m=ListDelete(head,s);
	if(m=0)
	printf("删除失败");
	
	p=head;
	t=listlength(head);

	for(i = 0;i < t;i++)
	{
		
		printf("%5d",p->next->data);
		p=p->next;
	}
	return 0;
}

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值