7-数据结构-(带头节点)单链表的增删改查

问题:

        单链表带头结点的创建以及输出,以及带与不带头节点的区别

思路:

  1. 单链表,逻辑上是线性结构,由许多单链表结点,串成一串。其单链表结构体中,数据项由data数据域和结点指针域。
  2. 带头节点是为了使在空表时的操作更统一。如果不带头节点,空表插入时,直接让头指针,和第一节点指针相等即可。而非空表插入时,则时s->next=l->next;l->next=s;头插,两个操作。而带上头节点,所有情况下的插入操作,都同意了即都为s->next=l->next;l->next=s。
  3. 值得注意的是,带头节点的单链表,遍历输出时,记得从第二哥结点开始遍历,即让结点指针=头指针的指针域。即snode*s =l->next;
  4. 在指针改变实际值时,C语言中,要么来哥双指针,要么正常一维指针,最后返回头指针,主函数内接收即可。我觉得为了好理解,就用返回这个吧,整那么花里胡哨,也挺乱的。嗯

头插法:

//创建带头节点的单链表
snode* sheadlist(linklist l,int n)
{
		snode *phead=l;      
		phead=(snode*)malloc(sizeof(snode));//创建头节点 
		phead->next=NULL;  
		
		int i=0,x=n,k=0;
		printf("请输入想要插入的值\n");
		for(i=0;idata=k;
			p->next=phead->next;
			phead->next=p;
				
		}
		
		return phead;
} 

尾插法:

//创建带头结点尾插法 
linklist srearlist(linklist l,int x)
{
	snode* phead=l;//创建头节点
	phead=(linklist)malloc(sizeof(snode));//用头结点创造空间,指针l没有创建,因此返回的时候返回头节点 才能获取整个单链表地址 
	phead->next=NULL;
	int i,k;
	snode *end=phead;//工作指针,从头节点开始工作 
	printf("请输入值\n");
	for(i=0;idata=k;
		
		end->next=p;//直接给新结点连接起来 
		end=p;      //因为尾插,所以要时刻知道最后一个结点的位置,因此s指针也跑到新加入的结点p上面. 
	}
	end->next=NULL;	
	
	return phead;//头节点始终指向整个单链表,因此返回头节点地址,用来获取整个字符串 
} 

按位查找,返回结点:

//返回第i个结点指针
snode* Searchnode(snode* phead,int i)
{
	int count=1;//从有序数据,数组第一个开始计算
	snode* p=phead->next;
	if(i==0) return phead;//返回头节点
	if(i<0) return NULL;  //无效值
	while(p!=NULL && count != i)  //进行遍历,每一次进行比对,每次遍历指针后移
	{
		p=p->next;
		count++;
	}
	
	return p;	
} 

按值查找,返回位置:

//按值查找 
int Search_zhinode(snode* phead,int x)
{

	snode* p=phead->next;
	int count=1;
	while(p->data!=x)
	{
		p=p->next;
		count++;
	}
	
	return count;	
} 

代码如下:

#include 
#include 
#include 
//创建带头结点单链表 
typedef struct snode
{
	int data;
	struct snode *next;
}snode,*linklist;
//创建带头节点的单链表
snode* sheadlist(linklist l,int n)
{
		snode *phead=l;      
		phead=(snode*)malloc(sizeof(snode));//创建头节点 
		phead->next=NULL;  
		
		int i=0,x=n,k=0;
		printf("请输入想要插入的值\n");
		for(i=0;idata=k;
			p->next=phead->next;
			phead->next=p;
				
		}
		
		return phead;
} 

//创建带头结点尾插法 
linklist srearlist(linklist l,int x)
{
	snode* phead=l;//创建头节点
	phead=(linklist)malloc(sizeof(snode));//用头结点创造空间,指针l没有创建,因此返回的时候返回头节点 才能获取整个单链表地址 
	phead->next=NULL;
	int i,k;
	snode *end=phead;//工作指针,从头节点开始工作 
	printf("请输入值\n");
	for(i=0;idata=k;
		
		end->next=p;//直接给新结点连接起来 
		end=p;      //因为尾插,所以要时刻知道最后一个结点的位置,因此s指针也跑到新加入的结点p上面. 
	}
	end->next=NULL;	
	
	return phead;//头节点始终指向整个单链表,因此返回头节点地址,用来获取整个字符串 
} 
//返回第i个结点指针
snode* Search_weinode(snode* phead,int i)
{
	int count=1;
	snode* p=phead->next;
	if(i==0) return phead;
	if(i<0) return NULL;
	while(p!=NULL && count != i)
	{
		p=p->next;
		count++;
	}
	
	return p;	
} 
//按值查找 
int Search_zhinode(snode* phead,int x)
{

	snode* p=phead->next;
	int count=1;
	while(p->data!=x)
	{
		p=p->next;
		count++;
	}
	
	return count;	
} 

void slprintf(snode *s)
{
	snode *scan = s->next;//因为带头结点第一个结点为头节点,所以打印从第二个结点打印,因此这里需要注意 
	while(scan != NULL) 
	{
		printf("%d->",scan->data);
		scan = scan->next;
	}                   
	 
	printf("NULL\n");
}

int main()
{
	snode* phead;
//	phead=sheadlist(&phead,3);
	phead=srearlist(phead,3);
	slprintf(phead);
//	snode *p=Searchnode(phead,2);
	int pos=Search_zhinode(phead,66);
	printf("66的位置在单链表下标%d处",pos);
	return 0;
 } 

你可能感兴趣的:(数据结构笔记(0基础),数据结构,算法)