單鏈表的相關操作和測試(C語言)
阿新 • • 發佈:2018-12-13
“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,學習之用,嘿嘿<--> <-->