C语言 链表

C语言 链表

**结点:**每个空间采用动态数据分配,,每个数据空间保存一个数据,可以根据需求分配数据空间数,而每个数据空间就叫做一个结点。每个结点结构中,我们定义一个成员存放下一个结点的首地址,用于存放下一个结点的成员,这个称为指针域
**链表:**第一个结点的指针域存放下一个结点的首地址,以此内推一直到最后一个结点,最后一个结点的指针域指向Null。

链表的简单示意图

搜狗截图20180428155516

第0个结点称为头结点,没有数据只存放第一结点的首地址
每个结点的都是同一种数据结构

struct Node{
	int data;
	struct student *next;
}Node,*PNode;

链表的基本操作:

  • 链表的创建
  • 链表的判断
  • 链表的长度获取
  • 链表的插入
  • 链表的删除
  • 链表的遍历
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<stdbool.h>

#define LEN sizeof(struct Node)

typedef struct Node{
	int data;
	struct Node *pnext;
}Node, *PNode;

/*创建链表:pHead为头结点,pTail为尾结点,pNew为新创建的结点*/
PNode creatList(void){
	PNode pHead, pTail, pNew;
	int n, i;
	pHead = (PNode)malloc(LEN);
	pHead->pnext = NULL;
	pTail = pHead;
	printf("请输入链表的长度\n");
	scanf("%d",&n);
	for(i = 0; i < n; i++){
		pNew = (PNode)malloc(LEN);
		pNew->pnext = NULL;
		printf("请输入第%d个链表的值\n", i+1);
		scanf("%d", &pNew->data);
		pTail->pnext = pNew;
		pTail = pNew;		
	}
	return pHead;
}

/*链表的判断:判断链表是不是为空*/
bool isempty(PNode pHead){
	if(pHead->pnext == NULL)
		return true;
	else return false;
}

/*链表的长度:获取链表的长度*/
int list_num(PNode pHead){
	int num = 0;
	PNode p;
	p = pHead->pnext;
	while(p != NULL){
		num+=1;
		p = p->pnext;
	}
	return num;
}

/*链表的遍历:输出链表所有的数据*/
void traversal(PNode pHead){
	PNode p;
	p = pHead->pnext;
	while(p != NULL){
		printf("%d\n", p->data);
		p = p->pnext;
	}
}

/*链表的插入:插入的位置和数据需要提供*/
bool insert(PNode pHead, int val, int pos){
	PNode p, pNew;
	int i = 1;
	p = pHead->pnext;
	while(p != NULL){
		if(i == pos){
			pNew = (PNode)malloc(sizeof(LEN));
			pNew->data = val;
			pNew->pnext = p->pnext;
			p->pnext = pNew;
			printf("插入成功\n");
			return true;
		}
		p = p->pnext;
		i++;
	}
	printf("插入位置超过链表实际大小\n");
	return false;
}

/*链表的删除:*/
bool delete(PNode pHead, int pos){
	int i;
	PNode p, tmp;
	p = pHead;
	for(i=1; p!=NULL && i < pos; i++)
		p = p->pnext;
	if(p == NULL){
		printf("删除错误\n");
		return false;
	}
	tmp = p;
	p = p->pnext;
	tmp->pnext = p->pnext;
	free(p);
	return true;
}

int main(int argc, char const *argv[])
{
	PNode pHead;
	pHead = creatList();
	if(isempty(pHead))
		printf("链表为空\n");
	printf("链表的长度为:%d\n",list_num(pHead));
	traversal(pHead);
	//insert(pHead,55,1);
 	delete(pHead,2);
	traversal(pHead);
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/yujianfei/p/8973844.html