原始线性结构单链表的实现以及操作

这里不再赘述,直接上代码。

  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 }

 

这应该是一个最原始的代码,如果楼主总结的有错误的话,请@楼主告知。谢谢!

 

posted @ 2017-07-25 10:13  startor  阅读(172)  评论(0编辑  收藏  举报