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

链表的一些基本操作,记得上学期刚学c语言的时候觉得很难,加上自己学习态度不端正,那一部分就没学好,期末考便考到了链表,没有做出来。不过这里给小白的建议(虽然我也还是个小白)就是端正自己的学习态度,觉得难的话沉下心来慢慢学,思路慢慢就会明了的。下面给的代码包含了创建,插入,删除操作,有一点不全。

#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode{
	int data;            //链表数据域 
	struct Lnode * next; //链表指针域 
} LinkList; 

void Create_List(LinkList *);//创建一个空链表,L作为头结点,其数据域储存链表长度 方便操作 
void Fill_List(LinkList *);  //填充该链表,方便测试 
void Insert_List(LinkList *,int ,int );//在第n个结点之前增加元素e 
void Delete_List(LinkList *,int ); 	//删除第n个元素 
void Print_List(LinkList *);        //输出链表各个结点的数值 

int main()                          //测试各函数功能
{
	int n=1,e=100;           //这里作为测试值 
	LinkList * L;
	L = (LinkList *)malloc(sizeof(LinkList));//初始化指针 *L作为头结点 
	Create_List(L);
    Fill_List(L);
	Print_List(L);
	Insert_List(L,n,e);
	Print_List(L);
	Delete_List(L,n+1);
	Print_List(L);
	return 0;
}

void Create_List(LinkList *L)
{
	L->data = 0;
	L->next = NULL;
}
void Fill_List(LinkList *L)
//这里采用头插法 ,即从链表首端插入(头结点之后) 
{
	int i;
	LinkList * p;
	for(i = 0;i<9;i++)
	{
		p = (LinkList *)malloc(sizeof(LinkList));   //为新结点分配内存 
		p->next = L->next;                          //将新结点的指针域指向L->next 即原来L后面的元素地址,实现新结点*p与L后面的元素连接 
		L->next = p;                                //将L->next指向新结点,实现L与新结点连接,至此,结点连接工作已完成 
		p->data = i;                                //存入数据域 
		L->data ++;                                 //长度+1 
	}
 }
 void Print_List(LinkList *L)
 {
 	LinkList * p = L->next;                         //初始化p,使其指向L后面的结点,即第一个结点 
 	printf("the Elements of the LinkList:\n");
 	while(p)                                        //当p存在时 
 	{
 		printf("%d ",p->data);
 		p = p->next;                                //p后移 
	 }
	 printf("\n");
 }
 void Insert_List(LinkList *L,int n,int e)
 {
 	int i;
    LinkList * p = L;
    LinkList * s = (LinkList *)malloc(sizeof(LinkList *));
 	if(n<=0||n>L->data)
 	{
 		printf("Input Error");
 		exit(1);
	 }
	 for(i = 0;i<(n-1) ;i++)
	 {
	 	p = p->next;                //p不断后移,因为这里是在第n个结点前插入,故移动n-1次 
	 }
	 s->next = p->next;             //p->next即为第n个结点地址,这里解释与Fill_List插入部分相同 
	 p->next = s;
	 s->data = e;
	 L->data ++;
 }
 void Delete_List(LinkList *L,int n)
 {
 	int i;
 	LinkList * p = L;
 	if(n<=0||n>L->data)
 	{
 		printf("Input Error");
 		exit(1);
	 }
	 for(i = 0;i<(n-1);i++)
	 {
	 	p = p->next;             //找到第n-1个结点 
	 }
	 p->next = p->next->next;    //直接绕过第n个结点,将其与第n+1个结点连接,实现删除操作 
  } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值