c言语链表的增删查改(最简单)

#include <stdio.h> #include <malloc.h> #include <stdlib.h> //算法的分类和概念: //狭义的算法,存储数据的方式不一样 //广义的算法,不追求存储数据的方式,要求的是结果是否一样 //什么是泛型???? //利用某种技术达到的效果是:不同的存储方式,执行的操作时 一样的 typedef struct Node { int data; struct Node * pNext; }NODE, *PNODE; //数据域 //指针域 //Node 相当于 struct Node

PNODE 相当于 struct Node *

PNODE create_list(void); void traverse_list(PNODE); bool sort_list(PNODE); bool is_empty(PNODE); int len_list(PNODE); bool insert_list(PNODE,int,int); bool del_list(PNODE,int,int *); int main (void) { PNODE pHead= NULL; int val; pHead=create_list(); traverse_list(pHead); if(is_empty(pHead)) printf("链表为空!!!\n"); else printf("链表肯定不为空!!!\n"); printf("链表长度 len=%d\n",len_list(pHead)); printf("\n"); if(sort_list(pHead)) { printf("链表排序成功!!!\n"); } else

//等价于 struct Node * pHead=NULL;

//创建一个非循环链表,并将链表头结点的地址赋给 pHead

{ printf("链表排序失败!!!\n"); } traverse_list(pHead);

if(del_list(pHead, 3,&val)) { } else {

//删徐第二个元素

printf("成员删徐成功!!!删徐的值是%d\n",val);

printf("成员删徐失败!!!\n"); } traverse_list(pHead); return 0; } PNODE create_list(void) { int len; int i; int val; //临时存放链表数据的值 //分配了一个不存放数据的头结点 PNODE pHead=(PNODE)malloc(sizeof(NODE)); if(pHead==NULL) { printf("内存分配失败。"); exit(-1); } PNODE pTail=pHead; pTail->pNext=NULL; //创建一个 pTain 永远指向最后的节点

printf("请输入链表的节点的个数:len="); scanf("%d",&len); for(i=0;i<len;i++) { printf("请输入第%d 节点的值:",i+1);

scanf("%d",&val); PNODE pNew=(PNODE)malloc(sizeof(NODE)); if(pNew==NULL) { printf("内存分配失败。"); exit(-1); } pNew->data=val; pTail->pNext=pNew; pNew->pNext=NULL; pTail=pNew; } return pHead; } void traverse_list(PNODE pHead) { PNODE p=pHead->pNext; while(p!=NULL) { printf("%d ",p->data); p=p->pNext; printf("\n"); } } bool is_empty(PNODE pHead) { if(pHead->pNext==NULL) return true; else return false; } int len_list(PNODE pHead) { int len=0; while(pHead->pNext!=NULL) { ++len; pHead=pHead->pNext; }

return len; } bool sort_list(PNODE pHead) { int i,j,t; PNODE p,q; int len=len_list(pHead); //其实下面就是一个冒泡的排序 for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext) { for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext) { if(p->data>q->data) { t=p->data; p->data=q->data; q->data=t; } } } return true; } bool insert_list(PNODE pHead, int pos, int val) //向 pos 前插入一个数 { int i; PNODE p=pHead; while(NULL!=p && i<pos-1) { p=p->pNext; //这里是判断指针是否符合要求,没有所谓的垃圾值 ++i; } if(i>pos-1 || NULL==p) return false; PNODE pNew=(PNODE)malloc(sizeof(PNODE)); if(NULL==pNew) { printf("内存分配失败。"); exit(-1); } pNew->data=val;

PNODE q=p->pNext; p->pNext=pNew; pNew->pNext=q; }

//这个时候,其实 P 已经指向了 pos 的位置

bool del_list(PNODE pHead, int pos, int * pVal) { 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; *pVal=q->data; p->pNext=p->pNext->pNext; free(q); q=NULL; return true; }


相关文档

C语言指针链表(增、删、改、查)
链表的增删改查
c++课程设计《链表的实现-增删改查》
c链表的实现:增、删、改、查
超级简单的链表(C语言)
C语言链表实现增删改查
c语言简单链表操作
C语言中双向链表的增删改查输出头文件代码
C语言中双向链表的增删改查输出源文件代码
C语言链表的建立、插入、删除、查询与显示
电脑版