我的教科书中写了线性表怎么创立的,但是一个完整的代码怎么写困扰问我许久。
以至于托更,今日终于悟了,希望对初学者有所帮助
老规矩先上代码
#include<iostream>
#include<iomanip>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct city
{
int XH;
char CS[40];
char GX[40];
}ElemType;
typedef struct LinkNode
{
ElemType data;
struct LinkNode* next;
}LinkNode;
void CreateList(LinkNode*& L, ElemType a[], int n)//头插法
{
LinkNode* s;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
bool ListInsert(LinkNode*& L, int i, ElemType e)
{
int j = 0;
LinkNode* p = L, * s;
if (i <= 0) return false;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
bool ListDelete(LinkNode*& L, int i, ElemType& e)//删除数据元素
{
int j = 0;
LinkNode* p = L, * q;
if (i <= 0) return false;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
q = p->next;
if (q == NULL)
return false;
e = q->data;
p->next = q->next;
free(q);
return true;
}
}
void DispList(LinkNode* L)//输出线性表
{
LinkNode* p = L->next;
while (p != NULL)
{
printf("序号:%d, 城市:%s, 属性:%s。\n", p->data.XH, p->data.CS, p->data.GX);
p = p->next;
}
printf("\n");
}
int main()
{
LinkNode* L;
ElemType city[5] = { {010,"Bejing","北京,首都"},{021,"Shanghai","上海,直辖市"},{027,"Wuhan","武汉,湖北省省会"},{020,"Xian","西安,陕西省省会"},{025,"Nanjing","南京,江苏省省会"} };
CreateList(L, city, 5);
DispList(L);
ElemType e = { 000,"Chengdu","成都,四川省省会" };
int i = 3;
cout << "在第" << i << "个位置插入元素后:\n\n";
ListInsert(L, i, e);
DispList(L);
i = 4;
cout << "在第" << i << "个位置删除元素后:\n\n";
ListDelete(L, i, e);
DispList(L);
system("pause");
return 0;
}
再看效果
接下来就是具体的讲解,老规矩
由于建表和函数的说明,书上非常详细,在此我重点讲解主函数调用的具体说明。完成一个完完整整的代码。直接看最后面,开头可以浅看一下。兄弟们姐妹们,冲啊!
//#include<iostream>
//#include<iomanip>
//#include<string.h>
#include<stdlib.h> //经过测试只需要添加这两个头文件即可
//#include <corecrt_malloc.h> //第一行也可以换成#include <corecrt_malloc.h>,因为调用了malloc函数
#include<stdio.h>
//using namespace std;
typedef struct city //固定写法 为了定义数组中的属性
{
int XH;
char CS[40];
char GX[40];
}ElemType;
typedef struct LinkNode
{
ElemType data;
struct LinkNode* next;
}LinkNode;
void CreateList(LinkNode*& L, ElemType a[], int n)//头插法
{
LinkNode* s;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
bool ListInsert(LinkNode*& L, int i, ElemType e)
{
int j = 0;
LinkNode* p = L, * s;
if (i <= 0) return false;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
bool ListDelete(LinkNode*& L, int i, ElemType& e)//删除数据元素
{
int j = 0;
LinkNode* p = L, * q;
if (i <= 0) return false; //i小于0返回错误
while (j < i - 1 && p != NULL)//表没超出长度且表不为空
{
j++;
p = p->next; //向下查找
}
if (p == NULL) //表为空 返回错误
return false;
else
{
q = p->next;
if (q == NULL)
return false;
e = q->data;
p->next = q->next;
free(q);
return true;
}
}
void DispList(LinkNode* L)//输出线性表
{
LinkNode* p = L->next;
while (p != NULL) //指针指向的地址不为空,打印地址中的信息
{
printf("序号:%d, 城市:%s, 属性:%s。\n", p->data.XH, p->data.CS, p->data.GX);
p = p->next;
}
printf("\n");
}
int main()
{
LinkNode* L; //初始化线性表并以L代称
ElemType city[5] = { {010,"Bejing","北京,首都"},{021,"Shanghai","上海,直辖市"},{027,"Wuhan","武汉,湖北省省会"},{020,"Xian","西安,陕西省省会"},{025,"Nanjing","南京,江苏省省会"} };
//自定义数组中的元素,注意格式
CreateList(L, city, 5);//调用创建数据表这个函数,这个函数括号中的元素缺一不可,括号里面的值,第一个是L(也叫做数据表的代称),第二个是你的数组名(一定是第八行最后面的那个),第三个是上一行中数组中的元素个数
DispList(L); //输出函数括号里面只需要给个L即可(也就是你的线性表)
ElemType e = { {002},{"chengdu"},{"成都,四川省省会"} }; //开始插入新元素,定义一个变量e(变量名随便你改,这里改了函数那里也记得改)用来存储新的信息(也叫字符串)
ListInsert(L, 3, e); //这个是插入函数括号里面的第一个也是一样的道理,先给L(说明这是线性表L,而不是其他的表),第二个值是你选择插入的位置,也就是输出时这条信息是第几条,第三个把初始化定义的变量e的值传入函数
DispList(L); //打印一遍,和94行的意思一样
ListDelete(L, 4, e); //调用删除函数,第一个先给L(和第96行的意思一样),第二个值表明删除的是第几个元素,第三个值表示需要这么一个变量,把值存起来,如果他符合你传入的第二个值,那程序就把他删掉,所以第三个值是变量e
DispList(L); //打印一遍,不想说了,说三遍了
return 0; //程序结束
}