数据结构-链表练习
引用一篇关于地址、指针讲解的文章
https://blog.youkuaiyun.com/wallying/article/details/83141536
#include <stdio.h>
//一般用"地址"表示常量,用"指针"表示存储地址的变量
int x = 3; //定义int型变量x,内容为整数3
int *px = &x; //定义指向int型变量的指针px,内容为变量x的地址
int **ppx = &px; //定义指向int型变量地址的指针ppx,内容为指针px的地址
int main(int argc, char *argv[])
{
printf("Hello C-Free!\n");
printf(" &x = %p\r\n", &x);//x的地址
printf(" x = %d\r\n\n", x);//x的内容
printf(" &px = %p\r\n", &px);//px的地址
printf(" px = %p\r\n", px);//px的内容
printf(" *px = %d\r\n\n", *px);//px的内容作为地址的内容
printf(" &ppx = %p\r\n", &ppx);//ppx的地址
printf(" ppx = %p\r\n", ppx);//ppx的内容
printf(" *ppx = %p\r\n", *ppx);//ppx的内容作为地址的内容
printf("**ppx = %d\r\n\n", **ppx);//ppx的内容作为地址的内容再作为地址的内容
getchar();
return 0;
}
以下是链表的C语言实现,比较简单,作为练习。随着学习的深入会逐步发图、栈、队列、哈希表等。
/*链表独立练习*/
#include<stdio.h>
#include<stdlib.h>
typedef int elem; //定义链表中数据类型
typedef struct lnode
{
elem data; //定义数据元素
struct lnode *next; //结构指针
}lnode;
lnode *crearlistnode(int n); //创建结构体,结构如上定义
int getelem(lnode L,int i); //查找元素,在链表L中查找第i个位置上的元素
int insertlist(lnode *L,int i,elem e); //插入,在链表L中在第i位置插入元素e
int deletlist(lnode *L,int i);//,elem &e //删除,在链表L中,删除i位置元素
lnode *crearlistnode(int n) //头插法函数及其参数 int n 为形参
{
lnode *L; //定义头节点
L = (lnode *)malloc(sizeof(lnode)); //申请一个结构体结点大小的地址并把其指针指向L
L->next = NULL;
lnode *p; //新建结点的地址
printf("输入%d个值插入链表\n",n);
for(int i=n; i>0 ;--i)
{
p = (lnode *)malloc(sizeof(lnode)); //新建一个结点
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
return L;
}
int getelem(lnode L,int i)//,elem &e) //查找的链表-查找的位置-将查找到的元素导出
{
int e= 0;
lnode *head,*p; //定义头指针以及查找下表值
head = &L; //找到链表位置
p = head; //指针指向头结点
int j = 0; //计数用
while(p!=NULL&&j<i)
{
p = p->next;
j++;
}
if(p==NULL || j>i) return -1;
e = p->data; //将值带出
printf("所要查找的第%d个元素值为:%d\n",i,e);
return 0;
}
int insertlist(lnode *L,int i,elem e) //操作链表-插入位置-插入元素
{
lnode *p; //找到i-1结点(在其后面插入新元素)
int j = 0;
p = L;
while(p!=NULL&&j<i-1)
{
p = p->next;
j++;
} //循环结束(找到了需要的位置)
lnode *s = (lnode *)malloc(sizeof(lnode));//找到待插入位置后新建待插入单元
s->data = e; //填入数据
s->next = p->next; //新插入单元指向后继
p->next = s; //原前位置指向新插入单元
return 0;
}
int deletlist(lnode *L,int i)//,elem &e//操作链表-删除位置-删除元素
{
lnode *p,*q; //p找到删除位置前结点。q标记删除位置
int j = 0;
p = L;
while(p!=NULL&&j<i-1)
{
p = p->next;
j++;
}
q = p->next;
p->next = q->next;
// e = q->data;
return 0;
}
int main()
{
lnode *L; //声明链表,结构体
L = crearlistnode(5);//创建链表,(n个结点)
//getelem(*L,1); //查找元素,(对链表L操作,查找第2个位置元素)
insertlist(L,1,99); //插入元素,(对链表L操作,第1位置插入元素99)
elem e;
deletlist(L,3); //删除元素,(第3个位置,删除)
getelem(*L,4); //查找元素,(对链表L操作,查找第4个位置元素)
lnode *p;
p = L;
printf("输出线性表:\n");
while(p->next!=NULL)
{
p = p->next;
printf("%d ",p->data);
}
//system("pause");
return 0;
}
最后有些问题想求助。本人双非研一学生,研究方向为遥感图像变化检测。由于转专业,且能力不强打算自己研究C语言,敲出数据结构中的重要结构然后深入学习JAVA语言,而后学习前端或者后端开发等。只学过C语言且比较基础。想问问我这个想法可行否?有什么好的建议吗?