#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node * pNext; }*pNode,Node; //#define bool int; //#define的意思是单纯的替换,与别名没有关系,而且C语言中没有bool数据类型 typedef int bool; //typedef的意思就是别名,或者是声明结构体数据类型的变量,int 用bool来替换 #define true 0 #define false 1 pNode create_list(); void traverse_list(const pNode); bool is_empty(const pNode); int length_list(const pNode); bool insert_list(pNode, int, int); bool delete_list(pNode, int); void sort1_list(const pNode); void sort2_list(const pNode); int find_list(const pNode, int); //void sort3_list(const pNode, int left, int right); int main(void) { pNode pHead=NULL; pHead=create_list(); if(is_empty(pHead)) { puts("链表不为空!"); } else puts("链表为空!"); printf("链表的长度为:%d ",length_list(pHead)); puts("-----------------------------------链表值为--------------------------------"); traverse_list(pHead); puts("-----------------------------------冒泡排序--------------------------------"); sort1_list(pHead); traverse_list(pHead); puts("-----------------------------------普通排序--------------------------------"); sort2_list(pHead); traverse_list(pHead); //puts("------------------------------------快速排序-----------------------------"); //sort3_list(pHead,1,5); //traverse_list(pHead); puts("-----------------------------------插入链表--------------------------------"); insert_list(pHead, 5, 77); traverse_list(pHead); puts("-----------------------------------删除链表--------------------------------"); delete_list(pHead,3); traverse_list(pHead); puts("-----------------------------------查找链表---------------------------------"); find_list(pHead,49); return 0; } pNode create_list() { int len,val,i; //特别注意:C语言中,变量的定义必须放在前面,否则编译无法识别,会报错。 pNode pTail; pNode pHead=(pNode)malloc(sizeof(Node)); if(pHead==NULL) { printf("动态内存分配失败! "); exit(-1); } pTail=pHead; pTail->pNext=NULL; printf("请输入有效节点个数:len="); scanf("%d",&len); for(i=0;i<len;++i) { pNode pNew=(pNode)malloc(sizeof(Node)); if(pNew==NULL) { printf("动态内存分配失败!"); exit(-1); } printf("请输入数第%d个据域的值val=",i+1); scanf("%d",&val); pNew->data=val; pTail->pNext=pNew; pTail=pNew; pTail->pNext=NULL; } return pHead; } void traverse_list(const pNode pHead){ pNode p=pHead->pNext; while(p!=NULL) { printf("%d ",p->data); p=p->pNext; } putchar(' '); return; } bool is_empty(const pNode pHead) { if(pHead->pNext==NULL) return true; else return false; } int length_list(const pNode pHead) { int count=0; pNode p=pHead; while(p!=NULL) { count++; p=p->pNext; } return count; } bool insert_list(pNode pHead, int pos, int val) //位置从有效节点1开始 { int count=length_list(pHead); int i=1; pNode p=pHead; pNode q=(pNode)malloc(sizeof(Node)); if(q==NULL) { puts("内存分配失败!"); exit(-1); } q->data=val; if(pos<2 || pos>count+1) { puts("链表当中不存在该位置!"); return false; } while(i<pos-1) { ++i; p=p->pNext; } q->pNext=p->pNext; p->pNext=q; return true; } bool delete_list(pNode pHead, int pos) { int count=length_list(pHead); int i=1; pNode p=pHead->pNext; pNode q; if(pos<2 || pos>count) { puts("链表当中不存在该位置!"); return false; } while(i<pos-1) { ++i; p=p->pNext; } printf("删除的值是:%d ",p->pNext->data); q=p->pNext; p->pNext=q->pNext; free(q); //p->pNext=p->pNext->pNext; //free(p->pNext);//不能这么释放,这是错误的 return true; } //冒泡排序 void sort1_list(const pNode pHead) { int count=length_list(pHead); pNode p; int i,j; /* 这是定义变量,不叫逗号表达式。需要是表达式才行。 逗号表达式只取最后的那个表达式的值作为整个表达式的值, 但是前边的表达式也要运行,左结合性,从左往右运行的。 这个链表的for循环一定要用i,j;否则上限没法表示。 */ for(i=1,p=pHead->pNext;i<count-1;++i,p=p->pNext) for(j=1,p=pHead->pNext;j<count-i;++j,p=p->pNext) { if(p->data > p->pNext->data) { int temp; temp=p->data; p->data=p->pNext->data; p->pNext->data=temp; } } return; } //普通排序,注意第三方的使用非常重要 void sort2_list(const pNode pHead) { int count=length_list(pHead); pNode p,q; int i,j; for(i=1,p=pHead->pNext;i<count-1;++i,p=p->pNext)//第一个for循环表示比较多少次 for(j=i+1,q=p->pNext;j<count;++j,q=q->pNext)//第二个for循环表示和哪个对象比较 { if(p->data > q->data) { int temp; temp=p->data; p->data=q->data; q->data=temp; } } return; } int find_list(const pNode pHead, int val) { pNode p=pHead->pNext; int count=length_list(pHead); int flag=1,flag2=0; while(p !=NULL ) { if(p->data==val) { printf("你要查找的数的位置:%d ",flag); flag2++; } p=p->pNext; ++flag; } if(flag2==0) puts("链表中没有查找的值!"); return flag; } //快速排序 /* void sort3_list(const pNode pHead, int left, int right) { pNode p=pHead->pNext; pNode q=pHead->pNext; pNode r=NULL; int i=left; int j=right; int key=p->data; int count=length_list(pHead); while(q != NULL) q=q->pNext; if(i>=j) exit(-1); while(i<j) { //for(i=left,p=pHead->pNext;i<j,q->data<key;--j) while(i<j && q->data<key ) { --j; r->pNext=q; q=r; r=NULL; break; } p->data=q->data; //a[i]=a[j]; while(i<j && p->data>key ) { ++i; p=p->pNext; break; } q->data=p->data; } p->data=key; sort3_list(pHead, left, i-1); sort3_list(pHead, j+1, right); } */