第一次在CSDN上写东西,心里有点激动,希望自己可以坚持下去。
嘿嘿嘿,算是在CSDN上出道了。
文章简单的描述了一下,我在某科上机遇到的一点问题…
个人笔记使用,轻喷,附有源码,欢迎交流…
附件下载地址:
http://download.csdn.net/detail/qq_29747591/9529037
顺序表
顺序表是采用的连续的存储结构
结构为:
1.表长度
2.指向的数据
3.存储的空间(可以再分配)
typedef struct{
ElemType * elem;
int length;
int listsize;
}SqList;
顺序表的一些要点:
- 初始化. 分配listsize大小的空间
- 长度设置为0
- 清空顺序表的话就是将长度设置为0
。。。其他感觉没有什么好记的
//初始化顺序表 IntiaList
status IntiaList(SqList & L){
int n;
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType *));
if (!L.elem) exit(OVERFLOW);
L.length = 0;//将其置为空
L.listsize = LIST_INIT_SIZE;
printf("please input the number of the data!\n");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("please intput the value of the number %d:", i+1);
scanf("%d", &L.elem[i]);
L.length++;
}
return OK;
}
- L.elem = (ElemType )malloc(LIST_INIT_SIZE sizeof(ElemType *));
获得的L.elem相当于数组,但是在VS调试的过程中,是无法向数组那样看到里面的值的
只显示了一个值
看不到我表的下一个项的值…-_-我一直以为我写错了,查了很久- 表的插入:找到初始情况;
两个temp类似于游标的感觉不停的重复——–循环过程
结束判定;
status ListInsert(SqList & L, int i, ElemType e){
ElemType q, p, *newbase;
//插入不符合规则
if (i<1 || i>L.length) return FALSE;
else
{
L.length++;
if (L.length >= L.listsize){
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));//扩展该内存
if (!newbase) return(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
i--;
p = L.elem[i];
q = L.elem[i+1];
L.elem[i] = e;
//初始过程
for (; i < L.length-1; i++)
{
L.elem[i+1] = p;
p = q;
q = L.elem[i + 2];
}
return OK;
}
链表
- 链表的结构
结构体的递归
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*Linklist;
- 初始化链表
这是一个倒序插入的代码 输入1,2,3,插入3,2,1
原因是L->next固定不变,也就是插入的位置永远是头节点后面的那一个!
//初始化链表 IntiaList
status IntiaList(Linklist &L){
Linklist p ,temp;
//temp指向为空
//Linklist temp;
//temp = L;
int n;
printf("please input the number of the data!\n");
scanf("%d", &n);
if (!L) exit(OVERFLOW);
L = (Linklist)malloc(LIST_INIT_SIZE * sizeof(LNode));
L->next = NULL;
temp = L;
//为什么是指针就不可以了呢
for (int i =0; i < n; i++)
{
p = (Linklist)malloc(sizeof(LNode));
if (!p) exit(OVERFLOW);
printf("please intput the value of the number %d:", i+1);
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
//插入顺序是倒序的
p->next = temp->next;
temp->next = p;
temp = temp->next;
}
return OK;
}
但是如果生成一个temp的结构体指针来移动就可以实现顺着插入。
//初始化链表 IntiaList
status IntiaList(Linklist &L){
Linklist p ,temp;
//temp指向为空
//Linklist temp;
//temp = L;
int n;
printf("please input the number of the data!\n");
scanf("%d", &n);
if (!L) exit(OVERFLOW);
L = (Linklist)malloc(LIST_INIT_SIZE * sizeof(LNode));
L->next = NULL;
//要在L初始化了再指向
temp = L;
for (int i =0; i < n; i++)
{
p = (Linklist)malloc(sizeof(LNode));
if (!p) exit(OVERFLOW);
printf("please intput the value of the number %d:", i+1);
scanf("%d",&p->data);
//头指针移动了
p->next = L->next;
L->next = p;
L = L->next;
p->next = temp->next;
temp->next = p;
temp = temp->next;
}
return OK;
}
----------
其他感觉没什么好记的了,
编程的话,还是要注意以下数组的序号,和累计数的对应关系
int i=0;i<n;i++(循环n次)
...因为老师给了模板是C++的,有引用的概念,我的代码就看起来有点奇怪..
希望对大家有用!