實戰資料結構(6)_靜態連結串列的使用
前幾節介紹的動態連結串列都是用C中堆記憶體的開闢方法,用函式malloc,free來開闢和釋放節點,但是在某些語言中沒有指標的型別,如何做呢?可以用陣列來模擬動態連結串列的建立過程。
/************************************************************************/
/* @author lynnbest
目標:靜態連結串列的使用 插入和刪除
1.建立一個靜態迴圈連結串列 {A,B,C,D,E,F}
2.插入操作
3.刪除操作
4.列印操作 */
/************************************************************************/
/************************************************************************/
/* 思路:
用陣列來模擬動態連結串列的建立過程
1.插入
①先獲取備份空閒節點 L.av 同時更新新節點資料和av
②遍歷獲取位置 得到前驅節點
③插入
*/
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 10
typedef struct //節點結構體
{
char data; //資料域
int cur; //遊標指標
}slistnode;
typedef struct
{
slistnode list[size]; //陣列個數
int av; //備份遊標指標
}slinklist;
void InitSlinklist(slinklist *L);
void InsertSlistNode(slinklist *L,int pos,char ch);
void DeleteSlistNode(slinklist *L,int pos);
void PrintfSlist(slinklist L);
int length(slinklist L);
void main()
{
printf(" 靜態連結串列的使用 \n");
printf("----by lynnbest ----\n\n");
//初始化連結串列
slinklist L;
InitSlinklist(&L); //初始化靜態連結串列,m.
int choice,pos;
char ch;
while(1)
{
printf("1---建立靜態連結串列\n");
printf("2---插入節點\n");
printf("3---刪除節點表\n");
printf("4---列印當前元素\n");
printf("5---退出\n請選擇:\n");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
char a[]={'A','B','C','D','E'};
int len=sizeof(a)/sizeof(a[0]);
for(int j=1;j<=len;j++)
InsertSlistNode(&L,j,a[j-1]);
break;
}
case 2:
{
printf("請輸入要插入的元素位置和字元:\n");
scanf("%d,%c",&pos,&ch);
// printf("請輸入要插入的位置:\n");
// scanf("%d",&pos);
InsertSlistNode(&L,pos,ch);
break;
}
case 3:
{ printf("請輸入要刪除元素的位置:\n");
scanf("%d",&pos);
DeleteSlistNode(&L,pos);
break;
}
case 4:
{ printf("靜態連結串列中的元素為:\n");
PrintfSlist(L);
break;
}
case 5:
{
return;
}
default :
break;
}
}
}
void InitSlinklist(slinklist *L)
{
memset(L,NULL,sizeof(*L));
for(int i=0;i<size;i++) //初始化cur i是陣列編號
{
(*L).list[i].cur=i+1;
}
(*L).list[size-1].cur=0; //做迴圈
(*L).av=1; //分配空閒節點
}
void InsertSlistNode(slinklist *L,int pos,char ch)
{
if(pos<1||pos>size-1)
{
printf("插入位置非法\n");
return ;
}
int able=(*L).av; //獲取空閒節點
(*L).list[able].data=ch; //插入新資料
(*L).av=(*L).list[able].cur; //更新空閒節點
//int start=(*L).list[0].cur; //開始位置
int start=0;
for(int i=0;i<pos-1;i++)
start=(*L).list[start].cur;
//遍歷完後,查詢到 start為前驅編號
(*L).list[able].cur=(*L).list[start].cur; //先修改able的指標
(*L).list[start].cur=able; //在修改前驅編號的指標
}
void DeleteSlistNode(slinklist *L,int pos)
{
if(pos<1||pos>size-1)
{
printf("刪除位置非法\n");
return ;
}
// int pre=(*L).list[0].cur;
int pre=0;
for(int x=0;x<pos-1;x++)
pre=(*L).list[pre].cur; //查詢刪除節點的前驅編號
int next=(*L).list[pre].cur; //獲取下一個遊標
(*L).list[pre].cur=(*L).list[next].cur; //刪除操作結束
(*L).list[next].cur=(*L).av;
(*L).av=next;
}
void PrintfSlist(slinklist L)
{
int start=L.list[0].cur;
for(int i=1;i<=length(L);i++)
{
printf("%3c",L.list[start].data);
start=L.list[start].cur;
}
printf("\n");
}
int length(slinklist L)
{
int p=L.list[0].cur;
int count=0;
while( L.list[p].cur!=1)//還不完善
{ p=L.list[p].cur;
count++;
}
return count+1;
}
相關文章
- C#資料結構-靜態連結串列C#資料結構
- 實戰資料結構(1)_單連結串列的操作資料結構
- 實戰資料結構(10)_單連結串列的就地排序資料結構排序
- 實戰資料結構(8)_單連結串列的就地逆置資料結構
- 實戰PHP資料結構基礎之單連結串列PHP資料結構
- 資料結構實驗之連結串列三:連結串列的逆置資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構
- 資料結構-連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 探索資料結構:單連結串列的實戰指南資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構實驗之連結串列四:有序連結串列的歸併資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構實驗之連結串列一:順序建立連結串列資料結構
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 資料結構實驗:連結串列的應用資料結構
- Python資料結構——連結串列的實現Python資料結構
- 資料結構(雙向連結串列的實現)資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 實戰資料結構(9)_單連結串列實現多項式的相乘資料結構
- js實現資料結構--單連結串列JS資料結構
- 實戰資料結構(5)_雙向迴圈連結串列的基本操作資料結構
- 核心中的連結串列資料結構資料結構
- 資料結構——單連結串列的C++實現資料結構C++
- [資料結構]連結串列的實現在PHP中資料結構PHP
- [資料結構] 連結串列的實現在 PHP 中資料結構PHP
- Redis資料結構—連結串列與字典的結構Redis資料結構
- 實戰資料結構(2)_兩個單連結串列間的刪除操作資料結構
- 實戰資料結構(3)_兩個單連結串列間的合併操作資料結構
- Java版-資料結構-連結串列Java資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構