單鏈表:
線性表的鏈式存儲又稱單鏈表,它是通過一組任意的存儲單元來存儲線性表中的數據元素。爲了建立數據元素之間的線性關係,除存放元素自身的信息外,還需要存放一個指向其後繼的指針。
結構示意圖:
data | next |
特點:
這種存儲方式增加刪除元素較爲方便,但不支持隨機存取。
其基本實現代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//頭插法建立單鏈表
LinkList List_HeadInsert(LinkList &L){
//每次均在頭節點之後插入元素
LNode *s;//用於新節點的指針
int x;
L =(LNode*)malloc(sizeof(LNode));//創建頭節點
L->next=NULL;//初始化爲空
scanf("%d",&x);
while(x != 9999){
s=(LNode*)malloc(sizeof(LNode));//創建新節點
s->data=x;//將值放進數據域
s->next=L->next; //
L->next=s;//將新節點插入表中,L爲頭指針
scanf("%d",&x);
}
return L;
}
//尾插法建立單鏈表
LinkList List_TailInsert(LinkList &L){
//從表頭到表尾正向建立單鏈表,每次均在表尾插入元素
int x;
L=(LNode *)malloc(sizeof(LNode));
LNode *s;
LNode *r=L;//r爲表尾指針
scanf("%d",&x);//輸入結點的值
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);//只要輸入不結束,就繼續創建新節點
}
r->next=NULL;//尾指針置空
return L;
}
//按序號查找節點值
LNode *GetElem(LinkList L,int i){
//取出帶頭結點單鏈表第i個位置的結點指針
int j=1;
LNode *p=L->next;//將指針指向頭節點
if(i<1) return NULL;
if(i==0) return L;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找
void LocateElem(LinkList L,int e){
LNode *p=L->next;
int cnt=1;//用於記錄位置
while(p!=NULL&&p->data!=e){//當不到最後一個節點並且值沒有查到時,繼續查找
p=p->next;
cnt++;
}
if(p==NULL){
printf("不存在該值\n");
}else{
printf("該值的節點位置爲:%d\n",cnt);
}
}
//插入節點操作
void InsertLNode(LinkList &L,int e,int i){
LNode *s=(LNode*)malloc(sizeof(LNode));//創建新節點
s->data=e;
LNode *p=GetElem(L,i-1);
s->next=p->next;//先成鏈
p->next=s; // 再斷鏈,防止後面數據丟失
}
//刪除節點操作
void DeleteNode(LinkList &L,int i){
LNode *p=GetElem(L,i-1);
LNode *q=p->next;
p->next=q->next;
free(q);
}
//求表長操作
int GetLength(LinkList L){
int length=0;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
length++;
}
return length;
}
//輸出表
int PrintList(LinkList L){
LNode *p=L;
//printf("%d->",p->data);
while(p->next!=NULL){
p=p->next;
printf("%d->",p->data);
}
printf("\n");
return 0;
}
int main(){
LinkList l1;
printf("頭插法建立單鏈表,請輸入數據,輸入9999結束輸入\n");
List_HeadInsert(l1);//頭插法
PrintList(l1);//輸出表
printf("當前表長爲:%d\n",GetLength(l1));//求表長
InsertLNode(l1,9999,3); //插入節點操作
PrintList(l1);//輸出表
printf("當前表長爲:%d\n",GetLength(l1));//求表長
DeleteNode(l1,3); //刪除節點
PrintList(l1);//輸出表
printf("當前表長爲:%d\n",GetLength(l1));//求表長
LNode *t=GetElem(l1,3);//按位置查找
printf("該位置結點值爲%d\n",t->data);
LocateElem (l1,2);// 按值查找
LocateElem (l1,10);
// LinkList l2;
// printf("尾插法建立單鏈表,請輸入數據,輸入9999結束輸入\n");
// List_TailInsert(l2);
// PrintList(l2);
return 0;
}
運行截圖: