数据结构---链表的基本操作

这篇博客介绍了如何使用C语言实现链表的基本操作,包括头插法创建链表、插入元素、删除元素、查找元素和遍历链表。通过一个简单的菜单系统,用户可以交互式地进行这些操作。代码展示了链表数据结构的运用和指针操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实验目的及要求

通过该实验,深入理解链表的逻辑结构、物理结构等概念,掌握链表基本操作的编程实现,熟练掌握C语言中指针的操作。

2.实验主要仪器、设备和材料等

硬件:PC机

软件:Dev-C++、VC 6.0或CodeBlocks等。

3.实验内容(包括实验原理和操作步骤)

1、用头插法(或尾插法)建立带头结点的单链表;

2、对已建立的单链表实现插人、删除、查找和遍历等基本操作。

3、最好用菜单形式对应各个操作,使其编程一个完整的小软件。

参考界面:

 最后附上代码:


#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//1.初始化链表
Status InitList(LinkList &L)
{
	L=new LNode;
	L->next=NULL;
	return OK;
}
//2.后插法创建链表
void CreateList(LinkList *L,int n)
{

	LNode *p;
	LNode *r;
	int i;
	(*L) = (LNode *)malloc(sizeof(LNode));
    (*L)->next = NULL;
     r = *L;
     int a;
	for(i=0;i<n;i++){
	    printf("请输入第%d位元素:",i+1);
        scanf("%d",&a);
        p = (LNode *)malloc(sizeof(LNode));
        p->data = a;
        r->next = p;
        r = p;
	}
	 r->next = NULL;
}
//3.查找某一位置的元素值
Status GetElem(LinkList L,int i,ElemType &e)
{
	int j;
	LinkList p;
	p=L->next;
	j=1;
	while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return 0;
    e=p->data;
    return OK;
}
//4.查找链表中元素的位置
Status LocateElem(LinkList L,ElemType e)
{
	LNode *p;
	int i=1;
	p=L->next;
	while(p&&p->data!=e)
    {
        p=p->next;
        i++;
    }
    return(i);
}

//5.在某一位置前插入一个元素
Status ListInsert(LinkList &L,int i,int e)
{
	LNode *p,*s;
	int j=0;
	p=L;
	while(p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
        return 0;
    s=new LNode;
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//6.删除某一个元素
Status ListDelete(LinkList &L,int i)
{
	int j=0;
	LNode *p,*q;
	p=L;
	while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1)
        return 0;
    q=p->next;
    p->next=q->next;
    delete q;
    return OK;
}
//7.遍历链表输出
Status ListTraverse(LinkList *L)
{
    LNode *p, *q;
    p = *L;//将头指针赋值给p
    while(p->next != NULL){
        q = p->next;
        printf("%d\n", q->data);
        p = p->next;
    }
}
int n;
int e;
int main()
{
	int code;
	LinkList L;
	while(1)
	{
		system("cls");
		printf("***********************************************************\n");
     	printf("****                   ****系统菜单****                ****\n");
     	printf("****                                                   ****\n");
     	printf("****            *  1 初始化链表              *         ****\n");
     	printf("****            *  2 输入链表元素            *         ****\n");
     	printf("****            *  3 所指位序的元素值        *         ****\n");
		printf("****            *  4 链表已存在元素的位序    *         ****\n");
     	printf("****            *  5 在第i个位置插入元素     *         ****\n");
     	printf("****            *  6 删除第i个元素           *         ****\n");
     	printf("****            *  7 输出所输入的链表元素    *         ****\n");
     	printf("****            *  8 退出                    *         ****\n");
     	printf("****                                                   ****\n");
     	printf("***********************************************************\n");

		printf("请输入操作代码:");
		scanf("%d",&code);
		switch(code)
		{
		case 1:
			{
				int temp;
				temp=InitList(L);
				if(temp==OK)
				{
					printf("链表初始化成功!\n");
				}else
				{
					printf("链表初始化失败!\n");
				}
				break;
			}
        case 2:
			{
				printf("请输入要输入的元素个数:");
				scanf("%d",&n);
				CreateList(&L,n);
				break;
			}
		case 3:
			{
				int e,i;
				printf("请输入你要查找的序号:");
				scanf("%d",&i);
				GetElem(L,i,e);
				printf("你要查找的第%d位元素为:%d\n",i,e);
				break;
			}
		case 4:
			{
				int e,temp;
				printf("请输入要查找的元素:");
				scanf("%d",&e);
				temp=LocateElem(L,e);
				printf("所查找的元素位序为:%d\n",temp);
				break;
			}
		case 5:
			{
				int i,e,temp;
				printf("请输入要插入的位序:");
				scanf("%d",&i);
				printf("请输入要插入的元素:");
				scanf("%d",&e);
				temp=ListInsert(L,i,e);
				if(temp==OK)
					printf("插入成功!\n");
				else
					printf("插入失败!\n");
				break;
			}
		case 6:
			{
				int i,e,temp;
				printf("请输入要删除的位序:");
				scanf("%d",&i);
				temp=ListDelete(L,i);
				if(temp==OK)
					printf("删除成功!\n");
				else
					printf("删除失败!\n");
				break;
			}
		case 7:
			{
				ListTraverse(&L);
				break;
			}
		case 8:
			{
				printf("程序结束!\n");
				return 0;
				break;
			}
		default:printf("数据无效,请重新输入!");
		}
		system("pause");
	}
}

 
 
 
 
 
 
 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值