原始线性结构单链表的实现以及操作
这里不再赘述,直接上代码。
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 //引入头文件 6 7 typedef struct Node { 8 int data; //数据域 9 struct Node * pNext; //指针域 10 } NODE,*PNODE; 11 12 //声明一个结点类型 13 PNODE create_list(void); 14 void traverse_list(PNODE pHead); 15 bool is_empty(PNODE pHead); 16 int length_list(PNODE pHead); 17 void sort_list(PNODE pHead); 18 bool insert_list(PNODE pHead,int pos,int val); 19 bool delete_list(PNODE pHead,int pos,int *val); 20 21 22 23 24 //声明函数 25 26 int main(void) { 27 28 PNODE pHead = NULL; 29 pHead = create_list(); 30 traverse_list(pHead); 31 int len; 32 len = length_list(pHead); 33 printf("链表中共有%d个参数!\n",len); 34 sort_list(pHead); 35 traverse_list(pHead); 36 insert_list(pHead,2,555); 37 traverse_list(pHead); 38 int val; 39 delete_list(pHead,2,&val); 40 traverse_list(pHead); 41 42 return 0; 43 } 44 //插入数据,创建一个链表 45 PNODE create_list(void) { 46 int len; //用来存放有效节点的个数 47 int i; 48 int val; //用来临时存放用户输入的结点的值 49 PNODE pNew; 50 //分配了一个不存放有效数据的头结点 51 PNODE pHead = (PNODE)malloc(sizeof(NODE)); 52 pHead->pNext = NULL; //创建的时候定义一个头结点 53 if (NULL == pHead) { 54 printf("分配失败, 程序终止!\n"); 55 exit(-1); 56 } 57 PNODE pTail = pHead; //如果需要实现 尾插法的话 就需要这个指向尾结点的指针了 58 pTail->pNext = NULL; 59 printf("请输入您需要生成的链表节点的个数: len = "); 60 scanf("%d", &len); 61 for (i=0; i<len; ++i) { 62 printf("请输入第%d个节点的值: ", i+1); 63 scanf("%d", &val); 64 pNew = (PNODE)malloc(sizeof(NODE)); 65 pNew->pNext = NULL; 66 if (NULL == pNew) { 67 printf("分配失败, 程序终止!\n"); 68 exit(-1); 69 } 70 pNew->data = val; 71 //这样能实现尾插法 72 // pNew->pNext = pHead->pNext; 73 // pHead->pNext = pNew; 74 //头插法呢? 75 pTail->pNext = pNew; 76 pNew->pNext = NULL; 77 pTail = pNew; //这样就可以实现头插法了 78 } 79 80 return pHead; 81 } 82 //打印出链表的所有元素 遍历 83 void traverse_list(PNODE pHead) { 84 PNODE p = pHead->pNext; //头指针 85 86 while (NULL != p) { 87 printf("%d ", p->data); 88 p = p->pNext; 89 } 90 printf("\n"); 91 92 return; 93 } 94 95 bool is_empty(PNODE pHead) { 96 if(NULL == pHead->pNext) { // 判断一个链表是不是空的 主要就是使用 头指针就行判断 一个头指针为空链表为空 97 printf("链表为空!"); 98 return true; 99 } else { 100 return false; 101 } 102 } 103 //打印出链表的长度 104 int length_list(PNODE pHead) { 105 PNODE p = pHead->pNext; 106 int len = 0; 107 while(NULL != p) { 108 p=p->pNext; 109 len++; 110 } 111 return len; 112 } 113 114 void sort_list(PNODE pHead) { 115 int i,j,t; 116 int len = length_list(pHead); 117 PNODE p,q; 118 119 //i和j控制循环次数 p和q控制指针的移动 120 for(i=0,p=pHead->pNext; i<len-1; i++, p=p->pNext) { 121 for(j=i+1,q=p->pNext; j<len; j++,q=q->pNext) { 122 if(p->data>q->data) { 123 t = p->data; 124 p->data = q->data; 125 q->data = t; 126 } 127 } 128 } 129 return; 130 } 131 bool insert_list(PNODE pHead,int pos,int val) { 132 133 int i= 0; 134 PNODE p = pHead; 135 //前面一个就是说明他不是一个空的链表 136 //后面一个就是说明 137 while(NULL != p && i<pos-1) { 138 p=p->pNext; 139 i++; 140 } 141 if(p==NULL || i>pos-1) { 142 return false; 143 } 144 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 145 if(NULL == pNew) { 146 printf("动态分配内存失败!\n"); 147 exit(-1); 148 } 149 pNew->data = val; 150 //插入的过程 151 pNew->pNext = p->pNext; 152 p->pNext = pNew; 153 return true; 154 } 155 156 //指定位置删除结点 157 bool delete_list(PNODE pHead,int pos,int *val) { 158 int i= 0; 159 PNODE p = pHead; 160 while(NULL != p->pNext && i<pos-1) { 161 p=p->pNext; 162 i++; 163 } 164 if(p->pNext==NULL || i>pos-1) { 165 return false; 166 } 167 PNODE q = p->pNext; 168 *val = q->data; 169 //先把删除的那个结点记录下来 170 p->pNext = p->pNext->pNext; 171 free(q); 172 //将指针往后移一位删除掉删除的那个元素 173 //然后再进行释放 174 q= NULL; 175 return true; 176 }
这应该是一个最原始的代码,如果楼主总结的有错误的话,请@楼主告知。谢谢!