单链表简单操作

单向链表创建

链表是动态分配存储空间的链式存储结构。

其包括一个“头指针”变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址。

链表中每一个元素称为“结点”,每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域。指针域中存储的即是链表的下一个结点存储位置,是一个指针。多个结点链接成一个链表。

最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没有后继结点。

使用结构体变量作为链表中的结点,因为结构体变量成员可以是数值类型,字符类型,数组类型,也可以是指针类型,这样就可以使用指针类型成员来存放下一个结点的地址,使其它类型成员存放数据信息。

当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。

       单链表的示意图如下:

 

Head指针为单链表的头指针,单链表L:L既是单链表的名字,也是其头指针。链表中的最后一个结点的指针域定义为空指针(NULL)。

在创建列表时要动态为链表分配空间,C++语言的库函数提供了几种函数实现动态开辟存储单元。

malloc()函数实现动态开辟存储单元:

      malloc函数原型为:void *malloc(unsigned int size);

      其作用是在内存的动态存储区中分配一个长度为size的连续空间,函数返回值是一个指向分配域起始地址的指针(类型为void)。如果分配空间失败(如,内存空间不足),则返回空间指针(NULL)

这里我用关键字new来创建动态空间

首先创建空链表

node *init()
{
	return NULL;
} 

然后添加元素节点(这里我使用两种插入方法:倒插法和正插法)

//倒插法 
node* append1(node *head)
{
	printf("请输入需添加的值(0为结束点):\n");
	int n = -1;
	while(scanf("%d",&n) && n != 0)
	{
		node *p = new node();
		p->info = n;
		p->next = head;
		head = p;
	}
	return head;
}

//正插法 
node* append2(node *head)
{
	printf("请输入需插入的值(0为结束点):\n");
	head = new node();
	head->info = 0;
	node *q = head;
	
	int n = -1;
	while(scanf("%d",&n) && n != 0)
	{
		node *p = new node();
		q->next = p;
		p->info = n;
		p->next = NULL;
		q = p;
	}
	return head;
}

基本操作之插入

node* insert(node *head)
{
   printf("请输入需要插入的位置和值:\n");
   int position,x;
   scanf("%d%d",&position,&x);
   node *p = head;
   node *pre;
   int i = 0;
   if(!p) printf("链表为空\n");
   if(position == 0)
    {
	   node *q = new node();
       q->info = x;
       q->next = head;
	   head = q; 
	} 
	
   while(i != position && p)
   {
   	   pre = p;
   	   p = p->next;
   	   i++;
   }
   if(!p)
      printf("不存在这个位置的结点\n");
   else
      {
      	  node *q = new node();
      	  q->info = x;
      	  q->next = pre->next;
      	  pre->next = q;
      } 
   return head;
}

基本操作之查找

//查找第i个节点 
node* find(node *head,int index)
{
    node*p = head;
    int j = 0;
	if(index < 0) return NULL;
	while(p && j!=index)
	    p=p->next,++j;	
    return NULL;
} 

基本操作之输出

//输出 
void display(node *head)
{
	node*p;
	p =head;
	if(!p)  printf("单链表非空\n");
	else
	{
		while(p)
		{
			printf("%d ",p->info);
			p = p->next;
		}
	}
}

基本操作之删除

node *delNode(node*head)
{
   printf("请输入需要删除的位置:\n");
   int position;
   scanf("%d",&position);
   node *p = head;
   node *pre;
   int i = 0;
   if(!p) printf("链表为空\n");
   if(p->next == NULL) return NULL;//只有一个节点,直接返回NULL
   while(i != position && p)
   {
   	   pre = p;
   	   p = p->next;
   	   i++;
   }
   if(!p){ pre->next = p->next;delete p;}
   return head;  
}
#include<iostream>
using namespace std;

typedef struct link_node
{
	int info;
	struct link_node*next;
}node;

node *init()
{
	return NULL;
} 

//输出 
void display(node *head)
{
	node*p;
	p =head;
	if(!p)  printf("单链表非空\n");
	else
	{
		while(p)
		{
			printf("%d ",p->info);
			p = p->next;
		}
	}
}

//倒插法 
node* append1(node *head)
{
	printf("请输入需添加的值(0为结束点):\n");
	int n = -1;
	while(scanf("%d",&n) && n != 0)
	{
		node *p = new node();
		p->info = n;
		p->next = head;
		head = p;
	}
	return head;
}

//正插法 
node* append2(node *head)
{
	printf("请输入需插入的值(0为结束点):\n");
	head = new node();
	head->info = 0;
	node *q = head;
	
	int n = -1;
	while(scanf("%d",&n) && n != 0)
	{
		node *p = new node();
		q->next = p;
		p->info = n;
		p->next = NULL;
		q = p;
	}
	return head;
}

node *delNode(node*head)
{
   printf("请输入需要删除的位置:\n");
   int position;
   scanf("%d",&position);
   node *p = head;
   node *pre;
   int i = 0;
   if(!p) printf("链表为空\n");
   if(p->next == NULL) return NULL;
   while(i != position && p)
   {
   	   pre = p;
   	   p = p->next;
   	   i++;
   }
   if(!p){ pre->next = p->next;delete p;}
   return head;  
}

node* insert(node *head)
{
   printf("请输入需要插入的位置和值:\n");
   int position,x;
   scanf("%d%d",&position,&x);
   node *p = head;
   node *pre;
   int i = 0;
   if(!p) printf("链表为空\n");
   if(position == 0)
    {
	   node *q = new node();
       q->info = x;
       q->next = head;
	   head = q; 
	} 
	
   while(i != position && p)
   {
   	   pre = p;
   	   p = p->next;
   	   i++;
   }
   if(!p)
      printf("不存在这个位置的结点\n");
   else
      {
      	  node *q = new node();
      	  q->info = x;
      	  q->next = pre->next;
      	  pre->next = q;
      } 
   return head;
}

//释放链表空间 
void del(node *head)
{
	node *p = head;
    while(p)
	{
		head = head->next;
		delete p;
		p = head ;
		//printf("del");	
	}	
}

//查找第i个节点 
node* find(node *head,int index)
{
    node*p = head;
    int j = 0;
	if(index < 0) return NULL;
	while(p && j!=index)
	    p=p->next,++j;	
    return NULL;
} 

int main()
{
	node *head;
	head = init();
    head = append1(head);
    head = insert(head);
    head = delNode(head);
    //head = append2(head);
	display(head);
	del(head);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40511966/article/details/82944590
今日推荐