压楼
运行截图
一些话
链表在初学c语言时是十分困难的对我来说,但是随着再次啃起数据结构,一切都似乎简单了一些。
在敲代码的过程中,深刻的理解了一句话:指针就是地址,地址就是指针
这句话老师在讲c语言那会经常说,当时半懂半不懂,现在似乎突然就懂了
可能我太聪明了吧!!!哈哈 ^ __ ^
链表和顺序表(动态建立)的区别
1.懒汉。我觉得链表和线性表最大的区别就是存储结构的不同!(这不废话吗!) 。然而我想说的:链表是需要新的节点才创建,有一点点懒汉式的味道。而顺序表不管是静态创立还是动态创立,都是提前就开辟好空间,会造成一定的空间浪费,而链表则没有这个缺点
2.数据密度。链表他一般有两个域:数据域,指针域。所以和顺序表的存储密度要高于链表。
3.至于数据的运算就先不谈,主要还不理解。
源代码
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct student{
ElemType data;
struct student* next;
}LNode,*LinkList;
//头插法建立单链表元素1..99
void List_HeadInsert(LinkList *l){
*l = (LNode*)malloc(sizeof(LNode));// (*l 指向的是头节点)建立头节点
(*l)->next=NULL;
LNode* s;
for(int i=1;i<=99;i++){
//为node开辟新的空间并赋值
s = (LNode*)malloc(sizeof(LNode));
s->data=i;
s->next=(*l)->next;
//将node插入到头节点之后
(*l)->next=s;
}
}
//尾插法建立链表
void List_TailInsert(LinkList *l){
(*l)=(LNode*)malloc(sizeof(LNode));
(*l)->next=NULL;
LNode *s,*t;
t=(*l);
for(int i=1;i<=99;i++){
s=(LNode*)malloc(sizeof(LNode));
s->data=i;
s->next=NULL;
t->next=s;
t=s;
}
}
//按序号查找元素
LNode* getElem(int i,LinkList l){
int j=0;
LNode *p=l; //指向头节点作为 0
while(p!=NULL&&j<i){
p=p->next;
j+=1;
}
return p;
}
//在第i个位置插入元素
int LinkListInsert(LinkList *l,int i,ElemType data){
printf("在第%d个位置插入元素%d\n",i,data);
if(i<1)
return 0;
LNode* p=getElem(i-1,*l);
LNode* node=(LNode*)malloc(sizeof(LNode));
node->data=data;
node->next=p->next;
p->next = node;
return 1;
}
//初始化单链表
int InitList(LinkList *l){
*l = (LNode*)malloc(sizeof(LNode));//创建头节点
//分配存储空间失败
if(l==NULL)
return 0;
(*l)->next=NULL;
return 1;
}
void PrintList(LinkList l){
LNode* p=l;
while(p->next!=NULL){
p=p->next;
printf(" %d",p->data);
}
printf("\n");
}
int main()
{
LinkList s;
InitList(&s);
LinkListInsert(&s,1,1);
LinkListInsert(&s,2,2);
PrintList(s);
printf("头插法建立单链表(逆序)\n");
LinkList p;
List_HeadInsert(&p);
PrintList(p);
LinkList p2;
printf("尾插法创建单链表(顺序)\n");
List_TailInsert(&p2);
PrintList(p2);
return 0;
}
(我是shenhe小姐的狗!! 狗头)