数据结构线性表的链式存储结构c语言版

数据结构线性表的链式存储结构c语言版

链表的头插法创建,尾插法创建,输入,输出,插入,删除,按值查找,按位查找,删除,销毁操作

C代码

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;

typedef struct LNode{          //定义单链表结点类型
	ElemType data;
	struct LNode *next;
}LNode, *LinkList; 


ListHeadInsert(LinkList &L,int n);             //头插法创建单链表
ListTailInsert(LinkList &L,int n);             //尾插法创建单链表
ListInsert(LinkList &L,int i, ElemType e);     //在某一结点前插入
Listdeldata(LinkList &L,int i);		           //删除结点数据
Listlocatedata(LinkList &L,ElemType e);		   //按值查找
Listgetdata(LinkList &L,int i);				   //按位置查找
void FreeList(LinkList L);					   //销毁单链表
void displayData(LinkList L);				   //单链表输出


 ListHeadInsert(LinkList &L,int n)
{	
	int i;
	LinkList p;           //创建新结点p
	L=new LNode;          //给L分配空间
	L->next=NULL;         //L的next域为空
	for(i=n;i>0;i--)
	{
		p=(LNode*)malloc(sizeof(LNode));	  //创建新结点
		printf("请输入第%d数据:",i);
		scanf("%d",&(p->data));
		p->next=L->next;  //  L为头指针
		L->next=p;
	}
	printf("创建成功!\n");
	return 1;
}

ListTailInsert(LinkList &L,int n)
{
	int i;
	LinkList p,q;         //创建新表p,q
	L=new LNode;          //给L分配空间
	L->next=NULL;         //L的next结点为空 
	q=L;                  //创建头表
	for(i=0;i<n;i++)
	{
		p=new LNode;	  //创建新表
		printf("请输入第%d数据:",i+1);
		scanf("%d",&p->data);
		p->next=q->next;  //头表q的next指针给新单链表p
		q->next=p;        //头表q指向下个单链表p
		q=p;              //p作为新的头表
	}
	printf("创建成功!\n");
	return 1;
}

Listlocatedata(LinkList &L,ElemType e)
{ 
	int count=0;
	LinkList p;
	p=L;
	while(p->data!=e && p->next!=NULL){  
		p=p->next;
		count++;
	}
	if(p->next==NULL && p->data!=e){
		printf("没有找到!\n");
	}
	else{
		printf("该元素位于链表的第 %d 位\n",count);
	}
	return 1;
}

Listgetdata(LinkList &L,int i)
{
	int count=0;
	LinkList p,q;         //创建临时结点p,q
	p=L;
	while(p&&count<i){  //找到待删除结点的上一个结点
		p=p->next;
		count++;
	}
	if(!p||count>i||i<=0){
		printf("输入位置错误!\n");
		return 0;
	}
	printf("该位置的数据是: %d\n  ",p->data);
	return 1;
}

ListInsert(LinkList &L,int i, ElemType e)
{
	int count=0;
	LinkList p,q;         //创建临时结点p和插入结点q
	p=L;
	while(p&&count<i-1){  //找到插入位置的上一个结点p
		p=p->next;
		count++;
	}
	if(!p||count>i-1){
		printf("插入位置错误!\n");
		return 0;
	}
	else{
		q=new LNode;        //为新结点分配空间
		q->data=e;
		q->next=p->next;    //新结点指向p结点的下一个结点
		p->next=q;			//p结点指向q结点
		printf("插入成功!\n");
	}
		return 1;
}

Listdeldata(LinkList &L,int i)
{
	int count=0;
	LinkList p,q;         //创建临时结点p,q
	p=L;
	while(p&&count<i-1){  //找到待删除结点的上一个结点
		p=p->next;
		count++;
	}
	if(!p||count>i-1){
		printf("输入位置错误!\n");
		return 0;
	}
	q=p->next;			  //令q指向被删除的结点
	p->next=q->next;	  //将p结点指向待删除结点的下一个结点
	free(q);			  //释放结点的存储空间
	return 1;
}

void FreeList(LinkList L)
{
	LinkList p,q;
	p=L;
	while(p!=NULL){			//当该结点不是链尾时
		q=p->next;			//让q指向头结点的后续结点
		free(p);
		p=q;				//p指针指向下一个结点
	}
	L=NULL;					//将头结点指针为0
    printf("该链表已成功被销毁!\n ");
}

void displayData(LinkList L )
{ 	 
     LNode *p=L->next;
	 printf("该链表为: ");
	 while(p)
	 {
		 printf("%d  ",p->data);
		 p=p->next;
	 }
	 printf("\n");
}




int main()
{
	int n,i;
	ElemType e;
	LinkList L;
	printf("\n\n\n");
	printf("\n\t\t\t\t\t\t1.头插法创建单链表");
	printf("\n\t\t\t\t\t\t2.尾插法创建单链表");
	printf("\n\t\t\t\t\t\t3.插入数据");
	printf("\n\t\t\t\t\t\t4.删除数据");
	printf("\n\t\t\t\t\t\t5.按值查找");
	printf("\n\t\t\t\t\t\t6.按位查找");
	printf("\n\t\t\t\t\t\t7.销毁单链表");
	printf("\n\t\t\t\t\t\t8.输出");
	printf("\n\t\t\t\t\t\t9.退出\n\n");
	while(1)
	{
		printf("\n请输入您想选择的操作:  ");
		int k;
		scanf("%d",&k);
		switch(k)
			{	
				case 1: 
					printf("请输入你想输入数据个数:");
					scanf("%d",&n);
					ListHeadInsert(L,n);
					break;
				case 2:
					printf("请输入你想输入数据个数:");
					scanf("%d",&n);
					ListTailInsert(L,n);
					break;
				case 3:
					printf("请输入你想在哪插入数据:");
					scanf("%d",&i);
					printf("请输入你想输入的数据:");
					scanf("%d",&e);
					ListInsert(L, i, e);
					break;
				case 4:
					printf("请输入你想删除的位置:");
					scanf("%d",&i);
					Listdeldata(L, i);
					break;
				case 5:
					printf("请输入你想查找的数据:");
					scanf("%d",&e);
					Listlocatedata(L,e);
					break;
				case 6:
					printf("请输入你想查找的位置:");
					scanf("%d",&i);
					Listgetdata(L,i);
					break;
				case 7:
					FreeList( L);
					break;
				case 8:
					displayData(L);
					break;
				case 9:
					return 0;
			}
	}
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值