赞
踩
- #include <stdio.h>
- #include <stdlib.h>
-
- typedef int Element;
- typedef char(*Status)[10];
-
- #define ERROR "error"
- #define OK "ok";
-
- // 定义一个线性单链表结构
- typedef struct Node{
- Element data;
- struct Node *next;
- }Node,*LinkedList;
-
- // 初始化一个线性单链表
- LinkedList init(){
- Node *l;
- l = (Node *)malloc(sizeof(Node));
- l->next = NULL;
-
- return l;
- }
-
- // 创建一个线性单链表
- void create(LinkedList l){
- for(int i = 2; i < 5; i++){
- LinkedList p;
- p = (LinkedList)malloc(sizeof(Node));
- p->data = i;
- p->next = l->next;
- l->next = p;
- }
- }
-
- // 插入数据到线性单链表中(头插法)
- void insertHead(LinkedList l,Element e){
- LinkedList p;
- p = (LinkedList)malloc(sizeof(Node));
- p->data = e;
- p->next = l->next;
- l->next = p;
- }
-
- // 插入数据到线性单链表中(尾插法)
- void insertTail(LinkedList L,Element e){
- LinkedList p,r;
- //r始终指向终端结点,开始时指向头结点
- r = L;
-
- //就是将这个尾指针指向最后一个元素
- while(r->next){
- r = r->next;
- }
- //申请新的结点
- p = (LinkedList)malloc(sizeof(Node));
- p->data = e;
-
- // 将表尾终端节点的指针指向新节点
- r->next = p;
-
- // 将当前的新节点定义为表尾终端节点
- r = p;
-
- //表示当前链表结束
- r->next = NULL;
- }
-
- // 从线性单链表中取出指定位置的数据(位置从0开始)
- Status LinkedListGet(LinkedList l,int i,Element *e){
- LinkedList p = l->next;
- int j = 0;
- while(p&&j<i){
- p = p->next;
- j++;
- }
-
- if(!p||j>i){
- return ERROR;
- }
- *e = p->data;
- return OK;
- }
-
- // 线性单链表的指定位置插入数据
- Status LinkedListInsert(LinkedList L,int index,Element e){
- LinkedList pre,p; //pre为前驱结点
- pre = L->next;
- int tempi = 1;
-
- while(pre&&tempi<index){
- // 就是再寻找第i-1个节点
-
- pre = pre->next;
- ++tempi;
- }
- if(!pre||tempi>index){
- // 第index个节点不存在
- return ERROR;
- }
- p = (LinkedList)malloc(sizeof(Node));
- p->data = e;
- p->next = pre->next;
- pre->next = p;
-
- return OK;
- }
-
- // 删除线性单链表的指定位置元素
- Status LinkedListRemove(LinkedList L,int index,Element *e){
-
- LinkedList pre,p;
- //pre为头指针
-
- pre = L->next;
- int tempi = 1;
-
- // 就是在寻找第i-1个节点
- while(pre&&tempi<index){
-
- pre = pre->next;
- ++tempi;
- }
-
- if(!(pre->next)||tempi>index){
- // 第index个节点不存在
- return ERROR;
- }
- p = pre->next;
- pre->next = p->next;
- *e = p->data;
- //将p的内存进行释放
- free(p);
-
- return OK;
- }
-
- // 查找线性单链表的指定元素,存在则返回这个元素的地址(不是所在的位置哦),不存在返回NULL;
- Node * LinkedListIndexOf(LinkedList L,Element e){
- LinkedList p;
- if(!L){
- return ERROR;
- }
- p = L;
- while(p&&p->data!=e){
- p = p->next;
- }
- return p;
- }
-
- // 清空线性表
- Status LinkedListClear(LinkedList L){
- LinkedList p,q;
- p = L->next;
- while(p){
- q = p->next;
- free(p);
- p = q;
- }
- // 将头节点的指针域置为空。
- L->next = NULL;
- return OK;
- }
-
-
- // 打印出线性单链表的所有数据元素
- void toString(LinkedList l){
- printf("[");
- l = l->next;
- while(l){
- printf("%d",l->data);
- l=l->next;
- if(l){
- printf(",");
- }
- }
- printf("]\n");
- }
-
- int main(){
- LinkedList L = init();
-
- create(L);
-
- //insertHead(L,5);
- insertTail(L,1);
-
- Element a = -1;
- // Element *a = &1;不要干这么傻逼的事情,常数的地址赋值给指针变量没有任何意义,c语言不允许这么做。
- // Element *a = 1;表示*a所存储的地址值为1。
- // 指针是用来存放地址的!地址就是个常数!虽然这样是能编译通过的!(准确地说,只能赋值0,其他的都不合法)。
- // 但是,这样执行会出错(段错误)的!因为指针本来是存放地址的,而你却存放了一个常数(即一个不合法的地址),
- // 这样就会使指针指向不确定的内存单元(非法访问),从而出现错误!
-
- Element *intPoint=&a;
- // *intPoint=a;等同于:int *intPoint; *intPoint = a;
- // 这个指针都没指向任何地址,也就不存在值,取也就会出错
-
- // 取出链表中第0个数据元素(下标从0开始)
- Status res = LinkedListGet(L,0,intPoint);
-
- printf("Get() res is :%s,element is %d\n",res,*intPoint);
-
- LinkedListInsert(L,2,5);
-
- res = LinkedListRemove(L,3,intPoint);
- printf("remove status :%s,remove Element is %d\n",res,*intPoint);
-
- Node *indexRes = LinkedListIndexOf(L,7);
- printf("..index Memory address :%d\n",indexRes);
-
- //LinkedListClear(L);
-
- toString(L);
-
- return 0;
- }
不足和错误之处还请多多指正,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。