为了复试开始复习C语言的一些编程技巧,今天复习C链表。
1.链表的结构体
typedef struct node{
int data;
struct node* next;
}Node;
2.创建一个有n的节点的链表
Node *LinkCreate(int n)
{
Node *head,*end,*s;
int i;
head = end= (Node*)malloc(sizeof(Node));//头结点没有data,只有next
for(i=1;i<n;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data = rand()%20; //随机给链表的data赋值(20以内)
end->next = s; //连接!
end=end->next; //继续后移!
}
end->next = NULL; //最后一位需要NULL,遍历的时候while(p)就行
return head;
}
补充说明:
1.malloc函数是动态分配空间,会返回开辟空间的首地址(这样就可以通过返回的指针找到它),加(Node *)的目的是让计算机知道,如何去划分这个开辟的空间。
2.图示如下
3.遍历链表
void outlink(Node* head) //头指针传入
{
Node *p;
p=head->next;
printf("%d, ",p->data);
while(p) //开始遍历,因为链表最后一位的next是NULL,所以到那里结束
{
printf("%d, ",p->data); //data打印出来
p=p->next;
}
}
4.插入
void insert(Node *head, int n)
{
Node *p = head, *in;
int i = 0;
while (i < n && p)
{
p = p->next;
i++;
} //指针后移到指定位置(n位之后)
if (p)
{
in = (Node*)malloc(sizeof(Node));
puts("输入要插入的值");
scanf("%d", &in->data);
in->next = p->next;
p->next = in; //最关键的两步,看图就明白了,一定要先把in->next赋值给p->next,不然就找不到了
}
else
{
puts("not found\n");
}
}
插入示意图如图
5.删除结点
void del(Node *head, int n)
{
Node *p = head, *in;
int i = 0;
while (i < n &&p)
{
in = p;
p = p->next;
i++;
}//同上
if (p)
{
in->next = p->next; //移交指针
free(p); //malloc分配相对应的free释放
}
else
{
puts("not found\n");
}
}
删除示意图如图