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