单链表

  建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。

 

 

1.设计的思路:

1)定义单链表。

3)建立单链表。

4)在链表的第i个位置插入值为x的结点。

5)删除链表的第i个结点。

6)输出单链表。

 

2.程序源码

#include "stdafx.h"
#include "stdio.h"//标准输入输出头文件
#include "stdlib.h"//系统函数
#include "malloc.h"//动态存储函数头文件
#define error 0
#define ok 1
typedef int Elemtype;
typedef int Status;
typedef struct Node//定义单链表
{
	Elemtype data;//定义数据域
	struct Node *next;
}Node,*LinkList;
LinkList create(int m)//建立单链表
{
	LinkList L;//定义结构指针
	Node *p1,*p2;//定义结点
	int i,data;
	L=(Node *)malloc(sizeof(struct Node));//动态分配内存空间
	p2=L;//将L的首地址赋值给p2
	printf("请输入链表的结点:/n");
	for(i=0;i<m;i++)
	{
		scanf("%d",&data);
		p1=(Node *)malloc(sizeof(struct Node));//动态分配内存空间p1为移动的指针
		p1->data=data;//赋值给data
		p2->next=p1;//指定头指针p2的下一个结点为p1
		p2=p1;//p2从头指针移动到p1
	}
	p2->next=NULL;//最后一个结点的指针域
	return L;
}
Status ListFind(LinkList L,int e)//在表中查找第e个元素 找到则返回该结点的指针 否则返回error
{
	LinkList p;
	int i=0;
	p=L->next;//初始化的时候指针指向第一个元素 i为计数器
	while(p&&i<e)
	{
		p=p->next; 
		i++;
	}
	if(p&&i==e) 
		return p->data;//存在第e个元素 返回第e个元素
	return error;
}
Status ListInsert(LinkList &L,int i,Elemtype e)//在单链表的第i个位置之前插入值为e的结点
{
	int j=0;
	Node *p,*s;
	p=L;//L的首地址赋给p
	while(p&&j<i-1)//寻找第i-1个结点
	{
		p=p->next;//指针后移
		++j;
	}
	if(!p||j>i-1)
		return error;
	s=(LinkList)malloc(sizeof (struct Node));//生成新结点
	s->data=e;//插入操作
	s->next=p->next;
	p->next=s;
	return ok;
}
Status ListDelete(LinkList &L,int i,Elemtype &e)//删除单链表第i个元素
{
	int j=0;
	Node *p,*q;
	p=L;
	while(p->next&&j<i-1)//寻找第i个结点,并令p指向其前依个结点
	{
		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;
}
void printf(LinkList L)//输出单链表
{
	Node *p;//声明结构指针
	p=L->next;//头指针的第一个结点
	printf("单链表的顺序为:");
	while(p!=NULL)
	{
		printf("%d",p->data);
	}
	p=p->next;
}
void menu()    //菜单函数
{
	printf("*************单链表**************/n");
	printf("1.建立单链表/n");
	printf("2.查找结点位置的元素/n");
	printf("3.插入新的元素/n");
	printf("4.删除元素/n");
	printf("5.输出单链表/n");
	printf("6.退出/n");
	printf("*********************************/n");
}
int main()
{
	LinkList L;
	int c,n,i,e,k;//c为判断的标识符,n为查找结点的位置,i为插入元素或删除元素的位置,e为插入元素,k为链表的长度
	menu();
	while(1)
	{
		printf("/n请输入选项:");
		scanf("%d",&c);
		switch(c)
		{
		     case 1:printf("请输入链表的长度:");
					scanf("%d",&k);
					L=create(k);
					break;
			case 2:printf("请输入要查找的结点元素:");
				   scanf("%d",&n);
				   ListFind(L,n);
				   break;
			case 3:printf("请输入插入元素的位置:");//在单链表L中第i个位置之前插入新的元素e
				   scanf("%d",&i);
				   printf("请输入插入元素:");
				   scanf("%d",&e);
				   ListInsert(L,i,e);
				   break;
			case 4:printf("请输入删除的元素位置:");//在单链表L中删除第i个元素的,并用e返回其值
				   scanf("%d",&i);
				   ListDelete(L,i,e);
				   break;
			case 5:printf("单链表的顺序为:");printf(L);break;//输出单链表的元素
			case 6:exit(error);//退出系统
		}
	}
	system("pause");
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值