单链表是线性表的一种,是数据结构中重要的内容,具有灵活和节省空间的特点,至于单链表的具体概念我就不说了,有很多人都说的比较详细了,之所以写这个博客是因为,我个人感觉,单链表初始化话的时候,有一个地方我一直不是很明白,想了一会儿才明白的,所以这篇博文的也就是对这个点的讲解算是创新点,其他的有很多大神都写的非常好。
大家可以参考这篇博文:http://blog.csdn.net/hackbuteer1/article/details/6591486/
下面就是我用代码实现的单链表的创建、查找、插入和删除等操作的代码:(代码写的比较垃圾,将就着看看吧)
-
/*
-
======================================================================================
-
难点:p2->next = p1;将p1的地址赋给p2-next,这样讲P2和p1链接了起来
-
p2 = p1;是将p1的地址给了p2,实际上是一个地址转移的问题,也就是p2原来的地址
-
不要的,转移到p1这里来了接下来,实际上已经增加了原来p1节点的一个数值了。
-
后p1自己再开辟一个新的空间,然后再重复上边的过程,
-
======================================================================================
-
*/
-
#include <stdio.h>
-
#include <string.h>
-
#include <malloc.h>
-
-
typedef struct student //单链表的固定结构体形式
-
{
-
int num;
-
struct student *next;
-
}list;
-
-
-
list *ListCreate()
-
{
-
list *head, *p1, *p2;
-
head = (list *)malloc(sizeof(list));
-
//head->num = 99/0/NULL;
-
//head->next = NUll/p1/2; // 这两句加上去掉都可以的,由此可以知道head是必须有的,起到
-
p2 = head; // 指针的作用,但他的值是什么,以及其next指向哪里没有影响
-
-
p1 = (list *)malloc(sizeof(list));
-
printf("请输入一个数值,输入0时结束:");
-
scanf("%d", &(p1->num));
-
-
while(p1->num != 0)
-
{
-
p2->next = p1;
-
p2 = p1; //理解这两句是精髓
-
-
p1 = (list *)malloc(sizeof(list)); //还是开辟
-
printf("请输入一串数值,输入0时结束:");
-
scanf("%d", &(p1->num));
-
}
-
p2->next = NULL; //最后一个节点指向的是空
-
-
return head;
-
}
-
-
-
list *ListFind(list *p, int n) //查找到链表p第n个节点
-
{
-
while(n) //一共执行n次,从head开始,正好是到第n个节点
-
{
-
p = p->next;
-
if(p == NULL)
-
return 0;
-
n--;
-
}
-
return p;
-
}
-
-
-
int ListLen(list *p) // 求单链表节点的个数
-
{
-
int i = 0;
-
while(p != NULL)
-
{
-
i++;
-
p = p->next;
-
}
-
return i-1;
-
}
-
-
-
int ListInsert(list *p, int n, int nu) //单链表的第n个位置上插入数组nu,后边的数值向后移动
-
{
-
list *padd, *q; //padd是新的节点
-
padd = (list *)malloc(sizeof(list)); //开辟一个新节点地址空间
-
q =ListFind(p, n-1);
-
-
padd->num = nu;
-
padd->next = q->next; //单链表插入的三个步骤
-
q->next = padd;
-
-
return 1;
-
}
-
-
-
int ListDelete(list *p, int n) // 删除链表p上第n个节点的值
-
{
-
list *q = ListFind(p, n-1);// q 是所要删除元素的前一个元素
-
list *ptr = ListFind(p, n);// ptr 是所要删除的元素
-
-
q->next = ptr->next; //删除只需要这一步即可
-
-
return 1;
-
}
-
-
int main()
-
{
-
list *p, *q, *l;
-
p = ListCreate();
-
q = p->next; //从head的下一个元素开始
-
-
ListInsert(p, 3, 999); //在链表第三个位置上插入999
-
ListDelete(p, 4); //删除单链表第四个位置上的元素
-
-
printf("创建的链表为:");
-
while(q) //输出所以的链表
-
{
-
printf("%4d", q->num);
-
q = q->next;
-
}
-
-
printf("\n");
-
-
l = ListFind(p, 3); //找到链表第三个位置上的元素
-
printf("Find = %d\n", l->num);
-
printf("NUM = %d\n", ListLen(p)); //输出链表的总长度
-
-
return 0;
-
}
阅读(1424) | 评论(0) | 转发(0) |