C语言实现数据结构静态链表的相关操作

    xiaoxiao2023-10-24  157

    #include <stdio.h> #include <stdlib.h> #define MAXSIZE 11 //定义结点 /*struct SLinkList { int data; int cursor; }component;*/ typedef struct { char data; int cursor; }SLinkList[MAXSIZE]; void InitSLinkList(SLinkList S);//初始化静态链表 void ShowSLinkList(SLinkList S);//遍历静态链表 int LengthSLinkList(SLinkList S);//求静态链表的长度 int GetLinkList(SLinkList S,int i); void InsertSLinkList(SLinkList S,int i,char data);//插入元素 void DeleteSLinkList(SLinkList S,int i); void main() { //component S[MAXSIZE] SLinkList S; int len; InitSLinkList(S);//初始化静态链表 ShowSLinkList(S); len = LengthSLinkList(S); printf("\n%d",len); printf("\n%d\n",GetLinkList(S,4)); InsertSLinkList(S,8,'z'); ShowSLinkList(S); printf("\n删除后的静态链表:\n"); DeleteSLinkList(S,5); ShowSLinkList(S); } void InitSLinkList(SLinkList S) { //游标从1开始 最后一个元素的游标是0 int i,k = 0; int c = 0; for(i = 1;i < MAXSIZE - 1;i++) { S[i - 1].cursor = i; } S[MAXSIZE - 2].cursor = 0; S[MAXSIZE - 1].cursor = 0; while(S[c].cursor != 0) { c = S[c].cursor; S[c].data = 'a'+ k; k++; } } void ShowSLinkList(SLinkList S) { int c = 0; while(S[c].cursor != 0) { c = S[c].cursor; printf("%c\t",S[c].data); } } int LengthSLinkList(SLinkList S) { int len = 0; int c = 0;//当前数组分量的位置 while(S[c].cursor != 0) { c = S[c].cursor; len++; } return len; } int GetLinkList(SLinkList S,int i)//假设i 是3,代表第三个元素,也就是下标 { //获取 int c = S[0].cursor; int j = 1;//计数器 用来判断当前结点是否是第i个结点 while(c != 0 && j < i) { c = S[c].cursor; j++; } return c;//返回的是游标 } void InsertSLinkList(SLinkList S,int i,char data)//i是第八个元素 { //思路 //由于需要将元素插入到第i个位置,也就是下标是i后面的一个位置 //此时 i - 1的元素游标是c 也就是8 所以要得到前一元素的位置 才能将c赋值为8 //长度+1就是要插入元素的下标 //要想第八个元素顺接起新插入的元素,必须将游标赋值为新元素的下标 //但是如果直接赋值 那么后面的元素将会断开连接 //所以先把后面第一个元素的下标给新元素的游标 这样新元素就会和后面的元素产生连接 //然后再将插入元素与前一个元素连接 int c,len; c = GetLinkList(S,i - 1); //printf("%d",c); if(c == 0) { printf("不符合插入规则!"); exit(1); } else { len = LengthSLinkList(S); S[++len].data = data; S[len].cursor = S[c].cursor; S[c].cursor = len; } } void DeleteSLinkList(SLinkList S,int i)//假设删除第5个位置的元素 i = 5 { //位置就是i // int c; c = GetLinkList(S,i-1);//假设删除第5个元素,实际上返回的是第四个元素的游标 也就是 5 //printf("%d",c); if(c == 0)//不能删除游标是0的结点 { printf("删除位置不合法!"); exit(1); } else { if(S[c].cursor == 0) { printf("删除失败");//前一个元素的游标是0 说明前一个元素不存在 exit(1); } else { //S[c].cursor = S[S[c].cursor].cursor; S[c].cursor = S[S[c].cursor].cursor; } } }
    最新回复(0)