新手学习数据结构与算法---单链表的基本操作

单链表操作。。。

大家指点一下。微笑

//单链表及其基本操作 
//这里的链表都是带头结点的------------- 
#include <stdio.h>
#include <malloc.h>         //用来进行动态内存分配
#include <stdlib.h>

typedef struct Node
{
	char data;             //数据域 
	struct Node * next;     //指针域 
}LinkList;                      //不要忘记这个;

LinkList * SetNull(LinkList * L)         //置空表操作 
{
	L->next = NULL;                 //只要将第一个节点的指针域设置为NULL即可 
	return L;                           
}

int Length(LinkList * L)          //求表长操作(带头结点),求的时候头结点不算 
{
	LinkList * p;
	int n = 0;
	p = L->next;                 //从头结点后面的首元素节点开始计数 
	while(p != NULL)            //循环计数 
	{ 
		p = p->next;           
		n++;
	}
	return n;
} 

LinkList * NumberGet(LinkList * L, int i)             //从带头结点的链表中找到第i个结点(头结点不算)
{
	int j = 1;
	LinkList * p;
	p = L->next;
	while(p != NULL && (j < i))                 //用j主要是防止i可能有:i<=0,i>n 
	{
		p = p->next;
		j++;
	}
	if(i == j)
		return p;
	else
		return NULL;                          //若未找到则返回NULL 
} 

LinkList * ValueGet(LinkList * L, char c)             //按值查找某个结点
{
	LinkList * p;
	p = L->next;
	while(p != NULL)
	{
		if(c == p->data)                   //把c写在前面是防止写成=,方便报错 
			break;                    //若找到则直接跳出 
		else
			p = p->next;
	}
	return p; 
}

void Insert(LinkList * L, int i, char c)       //链表的插入操作,在第i个位置插入值c(头结点不算)
{
	int j = 1;
	LinkList * p, * S;
	p = L;              //为什么这个不是p = L->next??? ,后面说明 
	while(p != NULL && (j < i))          //在j为i这个位置插入 
	{
		p = p->next;
		j++;
	}
	if(p == NULL)    //检测一下p是否为NULL
		printf("序号超过范围\n");
	else
	{
		S = (LinkList *)malloc(sizeof(LinkList));
		S->data = c;
		S->next = p->next;              //就是这个原因,这时p正好是i前面的那个结点 
	} 	p->next = S; 
} 

void Delete(LinkList * L, int i)
{
	int j = 1;
	LinkList * p, *T;
	p = L;       //不用p = L->next 原因同上
	while(p != NULL && (j < i))
	{
		p = p->next;
		j++;
	}
	if(p != NULL && (p->next != NULL))   //确定第i个跟第i-1个都不是NULL 
	{
		T = p->next;
		p->next = T->next;
		free(T);                 //释放这个结点 
	}
}

LinkList * CreatList()                  //建立单链表 
{
	char c;
	LinkList * head, * L, * S;
	L = (LinkList *)malloc(sizeof(LinkList));
	head = L;
	L->next = NULL;            //先建一个空链表 
    while(c != '#')
    {
    	S = (LinkList *)malloc(sizeof(LinkList));
    	S->data = c;
    	S->next = L->next;                  //让S->next变为NULL 
    	L->next = S;
    	c = getchar();
	}
	return head;
} 

void PrintList(LinkList * p)
{
	p = p->next;             //头结点不打印 
    while(p != NULL)
	{
		printf("%4c", p->data);
		p = p->next;
	}
}


int main()
{
	//自己定义测试 
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值