为了复试开始复习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.图示如下

C语言链表基础自学笔记


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");
	}
}

插入示意图如图

C语言链表基础自学笔记


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");
	}
}

删除示意图如图

C语言链表基础自学笔记

相关文章: