1 #include <stdio.h> 2 #include <stdlib.h> 3 #define OK 0 4 #define ERROR -1 5 6 // 7 typedef int Status; 8 typedef int ElemType; 9 10 /* 11 单链表的存储结构: 12 使用typedef定义的后面的LNode和*LinkList分别表示的是 13 LNode是一个结构体类型的可以用他定义其他变量例如 LNode node即 node也为LNode类型的结构体 14 *LinkList是一个结构体类型的指针可以用他定义其他变量例如 *LinkList node即 node也为LNode类型的结构体指针 15 */ 16 typedef struct LNode{ 17 ElemType data; //数据域 18 struct LNode *next; //指针域 19 }LNode,*LinkList; 20 21 int main(){ 22 ElemType data1[]={1,2,3,4,5,6,7,8,9}; 23 int n=9; 24 //声明创建链表的方法 25 //头插法 26 LinkList Create_Link_Tou(ElemType data1[],int n); 27 //尾插法 28 LinkList Create_Link_Wei(ElemType data1[],int n); 29 //获取第i个元素 30 Status GetElem(LinkList L,int i); 31 //在第i个元素之前插入元素 32 LinkList ListInsert_L(LinkList L,int i); 33 //删除链表中的第i个元素 34 LinkList ListDelete_L(LinkList L,int i); 35 //声明展示链表的方法 36 void DisPlay(LinkList L); 37 //循环调用Create_Link方法为链表赋值 38 LinkList head=Create_Link_Wei(data1,n); 39 //展示链表的方法 40 printf("原始列表的数据为:"); 41 DisPlay(head); 42 printf("插入后的列表的数据为:"); 43 head=ListInsert_L(head,4); 44 DisPlay(head); 45 head=ListDelete_L(head,3); 46 printf("删除后的列表的数据为:"); 47 DisPlay(head); 48 GetElem(head,5); 49 return 0; 50 } 51 52 #if(0) 53 //头插法创建单链表 54 //创建链表的方法 传入的参数为链表的指针(头结点)和数据域 55 LinkList Create_Link_Tou(ElemType data1[],int n){ 56 //给头结点分配空间 57 LinkList head_node=(LinkList)malloc(sizeof(LNode)); 58 if(head_node==NULL){ 59 return ERROR; 60 } 61 head_node->next=NULL; 62 int i; 63 for (i =0; i <n; i++){ 64 //给链表分配内存 65 LinkList p=(LinkList)malloc(sizeof(LNode)); 66 //进行赋值操作 67 p->data=data1[i]; 68 p->next=head_node->next; 69 head_node->next=p; 70 } 71 return head_node; 72 } 73 #endif 74 75 #if(1) 76 //尾插法创建单链表 77 LinkList Create_Link_Wei(ElemType data1[],int n){ 78 //给头结点分配空间 79 LinkList head_node=(LinkList)malloc(sizeof(LNode)); 80 if(head_node==NULL){ 81 return ERROR; 82 } 83 //首先将头结点的下一个指针为空 84 head_node->next=NULL; 85 //定义尾结点 86 LinkList rear; 87 //开始尾结点指向头结点 88 rear=head_node; 89 int i; 90 for (i =0; i <n; i++){ 91 //给链表分配内存 92 LinkList p=(LinkList)malloc(sizeof(LNode)); 93 //进行赋值操作 94 p->data=data1[i]; 95 rear->next=p; 96 rear=p; 97 } 98 //最后将尾结点的next为空 防止出现死循环 99 rear->next=NULL; 100 return head_node; 101 } 102 #endif 103 104 //展示链表的方法 传入的参数为链表的指针 105 void DisPlay(LinkList L){ 106 if (L == NULL){ 107 return; 108 } 109 // 链表第一个结点指针 110 LinkList temp = L->next; 111 while (temp!=NULL){ 112 printf ("%4d", temp->data); 113 temp = temp->next; 114 } 115 printf ("\n"); 116 } 117 118 119 #if(1) 120 //获取链表中的第i个元素 121 Status GetElem(LinkList L,int i){ 122 //创建一个ElemType类型的变量用来接收值 123 ElemType e; 124 //创建一个链表的指针变量 125 LinkList p; 126 //p指向头结点的下一个节点,头结点为传入的参数 127 p=L->next; 128 int j=1; 129 while(p!=NULL&&j<i){ 130 p=p->next; 131 ++j; 132 } 133 //如果为空返回错误 134 if(p==NULL||j>i){ 135 return ERROR; 136 } 137 e=p->data; 138 printf("第%d个元素是%d\n",i,e); 139 return OK; 140 } 141 #endif 142 143 #if(1) 144 //向单链表中插入元素的方法 在第i个元素之前插入元素e 145 LinkList ListInsert_L(LinkList L,int i){ 146 ElemType e=20; //要插入的元素 147 LinkList p; //创建一个链表指针 148 int j=0;//创建一个变量 149 p=L;//将头结点赋值给指针p 150 //找到i之前的节点 151 while(p!=NULL&&j<i-1){ 152 p=p->next; 153 ++j; 154 } 155 if(p==NULL||j>i-1){ 156 return ERROR; 157 } 158 //创建一个新节点 159 LinkList s=(LinkList)malloc(sizeof(LNode)); 160 //进行数据的赋值和指针的转换 161 s->data=e; 162 s->next=p->next; 163 p->next=s; 164 //返回头结点 165 return L; 166 } 167 #endif 168 169 #if(1) 170 //删除链表中的第i个元素 171 LinkList ListDelete_L(LinkList L,int i){ 172 int e,j=0; 173 LinkList p,q; 174 p=L; 175 //循环找到第i个元素 176 while(p->next!=NULL&&j<i-1){ 177 p=p->next; 178 ++j; 179 } 180 //错误判断 181 if(p->next==NULL||j>i-1){ 182 return ERROR; 183 } 184 //转换指针 删除节点 185 q=p->next; 186 p->next=q->next; 187 e=q->data; 188 printf("删除的%d元素为:%d\n",i,e); 189 return L; 190 } 191 #endif
运行结果:=========================================================================================================================================
原文地址:https://www.cnblogs.com/yh2924/p/12501723.html
时间: 2024-11-25 18:56:39