前言:
必备知识
首节点:第一个有效的节点
尾节点:最后一个有效节点
头结点:无有效数据,方便对链表进行操作,与首节点数据类型相同
头指针指向头结点的指针变量,存放有头结点的指针变量。
尾指针
确定一个链表需要多少参数?
只需要:头指针就行。
图示:
1.创建链表
初期工作:
#include<stdio.h> #include<stdlib.h> //elementdata typedef struct node { int data; struct node *pnext; }NODE,*PNODE; /*----------函数声明------------*/ PNODE create_list(); void traverse_list(PNODE phead); bool is_empty(PNODE phead); int length_list(PNODE phead); bool insert_list(PNODE,int ,int ); bool delete_list(PNODE,int ,int *); //void sort_list(PNODE phead);
目录
PNODE create_list() { int len; int i,values; PNODE phead=(PNODE)malloc(sizeof(NODE)); if(NULL==phead) { printf("动态内存分配失败\n"); exit(-1); } printf("请输入你要生成的链表节点个数:"); scanf("%d",&len); PNODE ptail=phead; ptail->pnext=NULL; for(i=0;i<len;i++) { printf("请输入第%d个节点的值:",i+1); scanf("%d",&values); PNODE ptemp=(PNODE)malloc(sizeof(NODE)); if(NULL==ptemp) { printf("动态内存,分配失败!\n"); exit(-1); } ptemp->data=values; ptail->pnext=ptemp; ptemp->pnext=NULL;// ptail=ptemp; } return phead; }
2.插入节点
代码示例:
bool insert_list(PNODE phead,int pos,int values) { int i=0; PNODE p=phead->pnext; while(NULL!=p&&i<pos-1) { p=p->pnext; i++; } if(i>pos+1||NULL==p) { return false; } PNODE ptemp=(PNODE)malloc(sizeof(NODE)); if(NULL==ptemp) { printf("动态内存分配失败!\n"); exit(-1); } ptemp->data=values; PNODE q=p->pnext; p->pnext=ptemp;// ptemp->pnext=q;// return true; }
3.删除链表中的节点
代码示例:
bool delete_list(PNODE phead,int pos,int *values) { int i=0; PNODE p=phead; while(NULL!=p->pnext&&i<pos-1) { p=p->pnext; i++; } if(i>pos-1||NULL==p->pnext) { return false; } PNODE q=p->pnext; *values=q->data; p->pnext=p->pnext->pnext; free(q); q=NULL; return true; }
4.打印链表的节点。
代码示例:
void traverse_list(PNODE phead) { PNODE ptemp=phead->pnext; while(NULL!=ptemp) { printf("%d ",ptemp->data); ptemp=ptemp->pnext; } printf("\n"); return; }
5.其他判断链表是否为空以及链表的长度
代码示例:
bool is_empty(PNODE phead) { if(NULL==phead->pnext) { return true; } return false; } int length_list(PNODE phead) { int length=0; PNODE ptemp=phead->pnext; while(NULL!=ptemp) { ptemp=ptemp->pnext; length++; } return length; }
6.整个代码:
示例:
//链表 #include<stdio.h> #include<stdlib.h> //elementdata typedef struct node { int data; struct node *pnext; }NODE,*PNODE; /*----------函数声明------------*/ PNODE create_list(); void traverse_list(PNODE phead); bool is_empty(PNODE phead); int length_list(PNODE phead); bool insert_list(PNODE,int ,int ); bool delete_list(PNODE,int ,int *); void sort_list(PNODE phead); /*----------函数声明------------*/ PNODE create_list() { int len; int i,values; PNODE phead=(PNODE)malloc(sizeof(NODE)); if(NULL==phead) { printf("动态内存分配失败\n"); exit(-1); } printf("请输入你要生成的链表节点个数:"); scanf("%d",&len); PNODE ptail=phead; ptail->pnext=NULL; for(i=0;i<len;i++) { printf("请输入第%d个节点的值:",i+1); scanf("%d",&values); PNODE ptemp=(PNODE)malloc(sizeof(NODE)); if(NULL==ptemp) { printf("动态内存,分配失败!\n"); exit(-1); } ptemp->data=values; ptail->pnext=ptemp; ptemp->pnext=NULL;// ptail=ptemp; } return phead; } void traverse_list(PNODE phead) { PNODE ptemp=phead->pnext; while(NULL!=ptemp) { printf("%d ",ptemp->data); ptemp=ptemp->pnext; } printf("\n"); return; } bool is_empty(PNODE phead) { if(NULL==phead->pnext) { return true; } return false; } int length_list(PNODE phead) { int length=0; PNODE ptemp=phead->pnext; while(NULL!=ptemp) { ptemp=ptemp->pnext; length++; } return length; } void sort_list(PNODE phead) {//狭义的算法是与数据的存储方式密切相关 //广义的算法是与数据的存储方式无关 //泛型: 是利用某种技术达到的效果就是不同的、 //不同的存储方式,执行的操作是一样的 int i,j,temp; int len=length_list(phead); PNODE p,q; for(i=0,p=phead->pnext;i<len-1;i++,p=p->pnext) { for(j=j+1,q=p->pnext;j<len;j++,q=q->pnext) { if(q->data<p->data) { temp=p->data; p->data=q->data; q->data=temp; } } } traverse_list(phead); return; } bool insert_list(PNODE phead,int pos,int values) { int i=0; PNODE p=phead->pnext; while(NULL!=p&&i<pos-1) { p=p->pnext; i++; } if(i>pos+1||NULL==p) { return false; } PNODE ptemp=(PNODE)malloc(sizeof(NODE)); if(NULL==ptemp) { printf("动态内存分配失败!\n"); exit(-1); } ptemp->data=values; PNODE q=p->pnext; p->pnext=ptemp; ptemp->pnext=q; return true; } bool delete_list(PNODE phead,int pos,int *values) { int i=0; PNODE p=phead; while(NULL!=p->pnext&&i<pos-1) { p=p->pnext; i++; } if(i>pos-1||NULL==p->pnext) { return false; } PNODE q=p->pnext; *values=q->data; p->pnext=p->pnext->pnext; free(q); q=NULL; return true; } int main() { int values; PNODE phead=NULL; phead=create_list(); traverse_list(phead); if(delete_list(phead,2,&values)) { printf("删除成功,您删除的元素是:%d\n",values); } else { printf("删除失败,您删除的元素不存在!\n"); } traverse_list(phead); insert_list(phead,2,33); sort_list(phead); if(is_empty(phead)) { printf("链表为空\n"); } else { printf("链表不为空\n"); } int length=length_list(phead); printf("链表长度%d\n",length); printf("排序后的结果\n"); sort_list(phead); // traverse_list(phead); return 0; }
运行环境Dev-C++,记得保存格式为.cpp。