很多大学生上大学时候学数据结构会觉得很痛苦,主要原因就是链表没有学好。然后数据结构一大堆知识都是以链表为基础的。
现实工作中,链表也是内存中比较常见的数据存储方式。
typedef struct book
{
int num;
struct book *next;//指向结构体类型的指针
}Book;
首先链表的节点就必须有两部分组成,1就是数据,2就是指向下一个节点的指针。
Book *head,*q;
q=head;
if((head=(Book*)malloc(sizeof(Book)))==NULL)exit(1); //初始化头结点,head是一个结点但是没有存储数据
head->next=NULL;
有了上面的结构体为基础,我们直接就可以做一个链表头出来,直接用malloc动态生成就行,完了之后用head代表着玩意,然后head->next指向空就行了
for(i=0;i<10;i++)
{
ListInsert(head,i,i+1);
}
之后我们可以用一个循环,直接在head后面插入10个节点
int ListInsert(Book *head,int i,int x)
{
Book *p,*q;
int j;
p=head; // p指向首元节点
j=-1;
while(p->next!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if((q=(Book*)malloc(sizeof(Book)))==NULL)exit(1);
//为q申请内存空间
q->num=x;
q->next=p->next;
p->next=q;
return 1;
}
具体的插入函数如上面所示。其实总的就是断开两个节点间的连接,新生成一个节点,插进去就行了。
void DeleteList(Book *head,int n)
{
Book *p,*q;
p=head;
int count=0;
while(count<n-1)
{
count++;
p=p->next;
}
q=p->next;
p->next=q->next;
free(q);
q->next=NULL;
}
删除节点更简单,直接断开某个节点前后的两个节点,然后拼接上就行了。
//c++/c,python,java 收徒,程序定做,q:2316773638
void TraveList(Book *head)
{
Book *p;
int count=0;
p=head->next;
while(p->next!=NULL) //这样没有遍历完吧??
{
count++;
printf("%d\n",p->num);
p=p->next;
}
printf("Length is %d\n",count);
}
遍历节点就是用一个while循环,只要节点的next不为空,那就一直读下去。
像这样的链表操作,在我们的网络游戏中,也是这样操作的。
欢迎和我讨论有关程序的问题。