C语言单链表
1.单链表的定义
2.单链表的创建
3.单链表的增删改查
1.单链表的定义
特点:每个结点除了存放数据元素外,还要存储指向下一个节点的指针
优点:不要求大片连续空间,改变容量方便
缺点:不可随机存取,要耗费一定空间存放指针
用代码定义
typedef struct node
{
int date;//定义数据
struct node *next;定义指针
}LinkList;
2.单链表的创建
在此之前我想说一下头结点的创建,一般有两种情况。

有头结点的单链表创建起来比较简单,此时头结点的date里面为空

优势1:第1个位置的插入、删除更加方便,带来操作上的统一
优势2:统一空表和非空表的处理
若使用头结点,无论表是否为空,头指针都指向头结点,也就是*LNode类型,对于空表和非空表的操作是一致的。
若不使用头结点,当表非空时,头指针指向第1个结点的地址,即*LNode类型,但是对于空表,头指针指向的是NULL,此时空表和非空表的操作是不一致的。
所以单链表一般为带头结点的单链表。
为了简便(绝对不是为了偷懒)
LinkList *creat(int n){
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (int i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
}
3.单链表的增删改查
LinkList* creattaillink()
{
LinkList* head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
int i;
while(1) {
scanf("%d",&i);
if(i==-1){
break;//我一般喜欢把-1当作结束的标志
}
else{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = i;
a->next=head->next;
head->next = a;
}
}
return head;
}
头插法出来是反的,如果不想反着出来只能用尾插法
LinkList*creattaillink()
{
LinkList* head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
LinkList*end;
end=head;
int i;
while(1){
scanf("%d",&i);
if(i==-1){
break;
}
else{
LinkList* a = (LinkList*)malloc(sizeof(LinkList));
a->data = i;
a->next=NULL;
end->next=a;
end=a;
}
}
return head;
}
void delet(LinkList *list, int n) {
LinkList *t = list, *in;
int i = 0;
while (i < n && t != NULL) {
in = t;
t = t->next;
i++;
}
if (t != NULL) {
in->next = t->next;
free(t);
}
else {
puts("节点不存在");
}
}
void change(LinkList *list,int n) {//n为第n个节点
LinkList *t = list;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
puts("输入要修改的值");
scanf("%d", &t->score);
}
else {
puts("节点不存在");
}
}
void out(LinkList*head){
LinkList*end;
end=head->next;//因为有头结点
while(end!=NULL){
printf("%d ",end->x);
end=end->next;
}
}

2638

被折叠的 条评论
为什么被折叠?



