写的时候进入了一个逻辑误区,认为对应的游标可以是对应的第几位元素,但游标只是指向下一位数组的位置,所以需要另外设置计数。
数组下标 | 数据元素 | 游标(下一位数据元素的数组下标) |
0 | 3 | 2 |
1 | 6 | 3 |
2 | 5 | 1 |
3 | 2 | 4 |
4 | 8 | -1 |
按位序依次是 3、5、6、2、8
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10 //静态链表的最大长度
//0号结点充当“头结点”,游标为-1表示已经到达表尾,游标充当指针
//定义方式1——王道课程
struct Node{ //静态链表结构类型的定义
int data; //存储数据元素
int next; //下一个元素的数组下标
};
//定义方式2——王道教材
typedef struct LinkList{
int data;
int next;
}SLinkList[MaxSize];
//初始化静态链表(把a[0]的next设为-1)
void InitSLinkList(SLinkList &a){
a[0].next = -1;
a[0].data = 0;
for(int i=0; i<MaxSize; i++){
a[i].data = 0;
a[i].next = -2; //表示空数据
}
}
//插入数据
bool CreateSLinkList(SLinkList &a, int n){
int b, c; //过渡数据
printf("请依照‘数据元素 下一个数据元素的位置’的格式输入数据\n");
printf("ps:最后一位数据元素的下一个元素位置请输入-1\n");
for(int i=0; i<n; i++){
if(a[i].next == -2) {
scanf("%d %d", &b, &c);
a[i].data = b;
a[i].next = c;
}
else
return false;
}
}
void PrintSLinkList(SLinkList a, int n){
printf("静态链表的数据为:\n");
for(int i=0; i<n; i++)
printf("%d 数据元素:%d 游标:%d \n", i, a[i].data, a[i].next);
}
//查找,从头结点出发挨个往后遍历结点,插入位序为i的结点
/*
找到一个空的结点,存入数据元素(如何判断结点是否为空:可让next为某个特殊值,如-2)
从头结点出发找到位序为i-1的结点
修改新结点的next
修改i-1号节点的next
*/
//查找静态链表位序第i位的数据元素
bool SearchElem(SLinkList a, int n, int i, int &e){
if(i<1 || i>n)
return false;
int j=0;
int count =1;
if(i == 1){
e = a[j].data;
return true;
}
while(count != i){
j = a[j].next;
count++;
}
e = a[j].data;
return true;
}
//返回第i位位序的下表
void ReSubscripts(SLinkList a, int i, int &s){
int count=1;
s = 0;
while (count !=i){
s = a[s].next;
count++;
}
}
//插入静态链表
bool InsertElem(SLinkList &a, int i, int e, int &n){ //(静态链表,位序,元素,链表元素个数)
if(n>MaxSize || n==MaxSize)
return false;
if(i<1 || i>n)
return false;
a[n].data = e;
int s;
ReSubscripts(a, i, s);
a[n].next = a[s].next;
a[s].next = n;
n++;
return true;
}
int main(){
int n; //数据元素个数
int i; //位序——查找
int e = 0; //返回的数据元素
int k; //位序——插入
SLinkList a;
InitSLinkList(a);
printf("请输入你要输入的数据元素个数(不超过10个):");
scanf("%d", &n);
if(n<1 || n>10)
{
printf("输入错误!\n");
return false;
}
if(CreateSLinkList(a, n))
PrintSLinkList(a, n);
else
printf("数据插入失败\n");
int flag = 1;
while (flag){
printf("请输入查找的静态链表的位序:");
scanf("%d", &i);
if(SearchElem(a, n, i, e))
printf("查找的第%d位的数据元素为%d \n", i, e);
else
printf("查找失败\n");
printf("请问是否需要继续查找,继续输入1,停止输入0 :");
scanf("%d", &flag);
continue;
}
flag = 1;
while(flag){
printf("\n请输入你想插入的位序和元素,格式:位序 元素\n");
scanf("%d %d",&k, &e);
if(InsertElem(a, k-1, e, n)){
printf("数据插入成功");
PrintSLinkList(a, n);
}
else
printf("插入失败");
printf("请问是否需要继续查找,继续输入1,停止输入0 :");
scanf("%d", &flag);
continue;
}
return 0;
}
运行结果
请输入你要输入的数据元素个数(不超过10个):5
请依照‘数据元素 下一个数据元素的位置’的格式输入数据
ps:最后一位数据元素的下一个元素位置请输入-1
3 2
6 3
5 1
2 4
8 -1
静态链表的数据为:
0 数据元素:3 游标:2
1 数据元素:6 游标:3
2 数据元素:5 游标:1
3 数据元素:2 游标:4
4 数据元素:8 游标:-1
请输入查找的静态链表的位序:2
查找的第2位的数据元素为5
请问是否需要继续查找,继续输入1,停止输入0 :0
请输入你想插入的位序和元素,格式:位序 元素
3 18
数据插入成功静态链表的数据为:
0 数据元素:3 游标:2
1 数据元素:6 游标:3
2 数据元素:5 游标:5
3 数据元素:2 游标:4
4 数据元素:8 游标:-1
5 数据元素:18 游标:1
请问是否需要继续查找,继续输入1,停止输入0 :0
Process returned 0 (0x0) execution time : 31.952 s
Press any key to continue.