数据结构线性表(三)单链表的具体操作及整表创建

一:头插法(就是你输入元素往前面插,所以你插入元素完后,你输入的最后一个数其实是在表的第一位)

(创建表其实就是元素的插入,就是多了几个步骤)

typedef struct Node{
	ElemType data;//数据域 
	struct Node *next;//指针域 
}Node;
typedef struct Node *LinkList;


/*n个元素,在主函数也要先建立一个空的单链表L*/

void createlisthead(LinkList *L,int n)//头插法创表
{
 LinkList p;声明指针p
int i;//计数器
*L=(LinkList)malloc(sizeof(Node));//为L开辟内存空间
(*L)->next=NULL;//建立带头结点的表
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
p->next=(*L)->next;//生成新结点赋值给p
(*L)->next=p;//p插入到前一结点前面
}
}

二:尾插法(正常思维,插入到后面,输入顺序与输出顺序相同)

void createlisttail(LinkList *L,int n)
{
LinkList p,r;//r是指向链表的变量
int i;
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(Node *)malloc(sizeof(Node));
scanf("%d",&p->data);
r->next=p;//起到一个连线的作用
r=p;//r始终指向最后一个结点(元素)
}
r->next=NULL;
}

三:单链表的具体操作(只写了一个删除,但是其他操作也都类似)

#include "stdio.h"
#include "stdlib.h"
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node{
	ElemType data;//数据域 
	struct Node *next;//指针域 
}Node;
typedef struct Node *LinkList;
void creatlisthead(LinkList *L,int n)//整表创建头插法 
{
	LinkList p;//声明指针p 
	int i;
	*L=(LinkList)malloc(sizeof(Node));//为空链表L开辟内存空间 
	(*L)->next=NULL;//头结点指向空 
	for(i=0;i<n;i++){//输入链表里的数据 
		p=(LinkList)malloc(sizeof(Node));
		scanf("%d",&p->data);
		p->next=(*L)->next;
		(*L)->next=p; 
	}
 }
 Status ListDelete(LinkList *L,int i,ElemType *e)//删除,具体删除的解释在前章博客也有解释 
  {
  	int j;
  	LinkList p,q;
  	p=*L;
  	j=1;
  	while(p->next&&j<i){
  		p=p->next;
  		++j;
	  }
	  if(!(p->next)||j>i)
	  return ERROR;
	  q=p->next;
	  p->next=q->next;
	  *e=q->next;
	  free(q);
	  return OK;
  }
  
  int main()
  {
  LinkList *L;//建立一个空链表来准备传递给creatlisthead函数创建整表 
  ElemType *e;// 声明一个e元素来靠它返回值 
   LinkList t;//声明一个t指针来后面指向删除元素后的链表 
 int a[5]={0};//建立数组,创建表是用头插法,越后面输入的元素在表中越前面,输出就会相反,所以要利用数组来将它逆序输出 
 int i=0;//定义i作为数组下标 
  int h,m,p; //m是数组输出的下标,p是判断删除是否执行了 
    	creatlisthead(&L,5);
  	printf("delet\n");
  	scanf("%d",&h);
  	p=ListDelete(&L,h,&e);
    if(p==OK){
	  t=*L;//让t指向删除元素后的链表头结点 
    while(t){//一个一个往后推出元素 
    	a[i++]=t->data;
    	t=t->next;
	}
	for(m=i-1;m>=0;m--)//因为上面的推出元素与输入是相反,所以靠数组将它逆序输出 
	printf("%d",a[m]);
}
  	return 0;
  }
四:单链表学完的体会

在实际操作的时候要注意main函数里的操作,特别是传L的地址要用&L,然后就是操作完后的输出链表里元素的操作。。先声明一个指针t,比如删除操作结束后,让t指向链表L,再while(t),t=t->next操作、。。这些都是要注意的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值