1 /* 2 list.c 3 代码是在看视频时跟着敲的,如有错误请指正 4 用的编译器:c-free 5 */ 6 #include7 #include 8 #include 9 10 typedef struct Node 11 { 12 int data;// 数据域 13 struct Node * pNext;//指针域 14 }NODE, *PNODE;//NODE等价于struct Node PNODE等价于struct Node * 15 PNODE create_list(void); 16 void traverse_list(PNODE phead); 17 bool is_empty(PNODE pHead); 18 int length_list(PNODE); 19 bool insert_list(PNODE,int,int);//在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始 20 bool delete_list(PNODE,int,int *); 21 void sort_list(PNODE); 22 23 int main(void) 24 { 25 PNODE pHead = NULL; //等价于 struct Node * pHead = NULL; 26 int val; 27 28 pHead = create_list();//创建一个非循环单链表 29 traverse_list(pHead); 30 31 //insert_list(pHead, 4, 33); 32 if(delete_list(pHead, 4, &val)) 33 { 34 printf("删除成功,您删除的元素是:%d\n",val); 35 } 36 else 37 { 38 printf("删除失败!你删除的元素不存在!\n"); 39 } 40 traverse_list(pHead); 41 //int len = length_list(pHead); 42 // printf("链表的长度是%d\n",len); 43 44 //sort_list(pHead); 45 //traverse_list(pHead); 46 /*if (is_empty(pHead)) 47 printf("链表为空!\n"); 48 else 49 printf("链表不空!\n"); 50 */ 51 return 0; 52 53 } 54 55 PNODE create_list(void) 56 { 57 int len;//用来存放有效节点的个数 58 int i; 59 int val;//用来临时存放用户输入的结点的值 60 61 //分配 了一个不存放有效数据的头结点 62 PNODE pHead = (PNODE)malloc(sizeof(NODE)); 63 if(NULL == pHead) 64 { 65 printf("分配失败,程序终止!\n"); 66 exit(-1); 67 } 68 PNODE pTail = pHead; 69 pTail->pNext = NULL; 70 71 printf("请输入你需要生成的链表节点数:len = "); 72 scanf("%d", &len); 73 74 for(i=0; i data = val; 86 pTail->pNext = pNew; 87 pNew->pNext = NULL; 88 pTail = pNew; 89 } 90 91 return pHead; 92 } 93 94 void traverse_list(PNODE pHead) 95 { 96 PNODE p = pHead->pNext; 97 98 while(NULL != p) 99 {100 printf("%d ", p->data);101 p = p->pNext;102 } 103 printf("\n");104 105 return;106 }107 108 bool is_empty(PNODE pHead)109 {110 if(NULL == pHead->pNext)111 return true;112 else113 return false;114 115 }116 int length_list(PNODE pHead)117 {118 PNODE p = pHead->pNext;119 int len = 0;120 121 while (NULL != p)122 {123 ++len;124 p = p->pNext;125 }126 return len; 127 }128 129 void sort_list(PNODE pHead)130 {131 int i, j, t;132 int len = length_list(pHead);133 PNODE p, q;134 135 for(i=0,p=pHead->pNext; i pNext)136 {137 for(j=i+1,q=p->pNext; j pNext)138 {139 if(p->data > q->data)//类似于数组中的 a[i] > a[j]140 {141 t = p->data;//类似于数组中的:t = a[i]; 142 p->data = q->data;//类似于数组中的:a[i] = a[j]; 143 q->data = t;//类似于数组中的 a[j] = t; 144 }145 }146 }147 }148 149 //在pHead所指向链表的第pos个节点的前面 插入一个新的结点,该节点的值是val ,并且pos的值是从1开始 150 bool insert_list(PNODE pHead,int pos,int val)151 {152 int i = 0;153 PNODE p = pHead;154 155 while (NULL != p && i pNext;158 ++i;159 } 160 if(i>pos-1 || NULL==p)161 return false;162 163 PNODE pNew = (PNODE)malloc (sizeof(NODE)); 164 if(NULL == pNew)165 {166 printf("动态内存分配失败!\n");167 exit(-1);168 }169 pNew->data = val;170 PNODE q = p->pNext;//q的作用就是临时temp变量171 p->pNext = pNew;172 pNew->pNext = q;173 174 return true;175 }176 177 bool delete_list(PNODE pHead,int pos,int *pVal)178 {179 int i = 0;180 PNODE p = pHead;181 182 while (NULL != p->pNext && i pNext;185 ++i;186 } 187 if(i>pos-1 || NULL==p->pNext)188 return false;189 190 PNODE q = p->pNext;191 *pVal = q->data;192 193 //删除p节点后面的结点 194 p-> pNext = p->pNext->pNext;195 free(q);196 q = NULL;197 198 return true; 199 }