1. 程式人生 > >單鏈表的相關操作和測試(C語言)

單鏈表的相關操作和測試(C語言)

“single-LinkList.h” 標頭檔案

#ifndef _SINGLE_LL
#define _SINGLE_LL
#include<stdlib.h>
#include<stdio.h>

#define flag -100
typedef int dataType;

//單鏈表的結點
typedef struct lnode{		
	dataType data;
	struct lnode *next;
}Lnode,*LinkList;

1.建立帶頭結點的單鏈表(從表頭插入)

//建立帶頭結點的單鏈表
LinkList Creat_LinkList1( ){	//從表頭插入結點(帶有頭結點)
LinkList L; Lnode *s; int x; L=(Lnode*)malloc(sizeof(Lnode)); //建立頭結點 L->next=NULL; //初始化最後一個結點的指標域為NULL scanf("%d",&x); while(x!=flag) { s=(Lnode*)malloc(sizeof(Lnode)); s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; }

2.建立帶頭結點的單鏈表(從表尾插入)

注意:用一個R指標指向當前連結串列的最後一個結點

//建立帶頭結點的單鏈表
LinkList Creat_LinkList2( ){				//從表尾插入結點(帶有頭結點)
	LinkList L;
	Lnode *s,*R;
	int x;
	L=(Lnode*)malloc(sizeof(Lnode));
	L->next=NULL;	R=L;					//R指向了當前連結串列的最後一個結點
	scanf("%d",&x);
	while(flag!=x)
	{
		s=(Lnode*)malloc(sizeof(Lnode));
		s->data=x;
		R->next=
s; R=s; scanf("%d",&x); } R->next=NULL; //置表尾結點next指標為空 return L; }

3.求表的長度

//求表長度
int Length_LinkList(LinkList L){
	int l=0;
	Lnode *p=L;
	if(p->next)								//判定後繼結點是否存在,有則l+1
	{ 
		p=p->next;
		l++; 
	}
	return l;
}

4.按序號查詢元素結點

//按序號查詢元素結點
Lnode* Get_LinkList(LinkList L,int i){
	int j=0;
	Lnode *p=L;
	if(i<0) 
	{
		printf("序號值非法,查詢失敗!\n");
		return NULL;
	}
	while(p->next && j<i)
	{	
		p=p->next;
		j++;
	}
	if(j==i)return p;						//判別是否查詢到該結點
	else	NULL;
}

5.按值查詢(定位)

//按值查詢(定位)
Lnode* Locate_LinkList(LinkList L,dataType x){
	Lnode *p=L;
	while(p->next && p->data!=x)
	p=p->next;
	if(p->data==x)	return p;				//做法和按序號查詢相似,判斷是否找到了data=x的結點
	else	 return NULL;
}

6.按序號插入結點

//按序號插入結點
int Insert_LinkList( LinkList L,int i,dataType x){
	Lnode *p,*s;
	p=Get_LinkList(L,i-1);
	if(!p)
		return 0;
	else
	{
		s=(Lnode*)malloc(sizeof(Lnode));
		s->data=x;
		s->next=p->next;
		p->next=s;
	}
	return i;
}

7.按序號刪除結點

//按序號刪除結點
int Delete_LinkList( LinkList L,int i,dataType *x){
	Lnode *p,*s;
	p=Get_LinkList(L,i-1);
	if(!p)
		return 0;
	else
	{
		s=p->next;
		p->next=p->next->next;
		*x=s->data;
		free(s);
	}
	return i;
}

8.釋放單鏈表

執行此操作不能忘了頭結點

//釋放單鏈表
int Free_LinkList(LinkList L){
	Lnode *p=L->next;
	Lnode *s;
	free(L);
	while(p)
	{
		s=p;
		p=p->next;
		free(s);
	}
	return 10;
}

9.列印連結串列

//列印連結串列
int display_LinkList(LinkList L){
	Lnode *p=L->next;
	if(!p) {
		printf("表空\n");
		return -1;
	}
	else
	while(p->next)				
		{	
			printf("%-3d",p->data);//只能列印到倒數第二個結點
			p=p->next;
		}
	printf("%-3d\n",p->data);		//打印表尾結點
	return 10;
}

10.翻轉連結串列

注意:在此翻轉的操作中要理清思路,需要靈活地從頭指標處將一個連結串列拆分成兩個連結串列

//翻轉連結串列
LinkList reverse(LinkList L){
	Lnode *p=L->next,*s;
	L->next=NULL;					//將頭指標置空,成為新的連結串列的頭指標
	while(p)
	{
		s=p;	p=p->next;
		s->next=L->next;
		L->next=s;
	}
}
/*
*	注意:在此翻轉的操作中要理清思路,需要靈活地從頭指標處將一個連結串列拆分成兩個連結串列
*/
#endif

Mode.cpp

#include"single_LinkList.h"
#include<stdio.h>
int main(){
	LinkList L;
	int x,f1,f2,f3;
	L=Creat_LinkList2();		//建立一個表
	if(L!=NULL)
		display_LinkList(L);
	printf("在第3結點的位置插入元素:78\n");
	f1=Insert_LinkList(L,3,78);
	if(f1==3)
		display_LinkList(L);
	printf("刪除第8結點\n");
	f2=Delete_LinkList(L,8,&x);
	if(f2==8)
		display_LinkList(L);
	f3=Free_LinkList(L);
	if(f3>0)
		printf("釋放連結串列,結束!");
}

補充

:小白上路,第一個CSDN,學習之用,嘿嘿<--> <-->