2.单链表的简单操作

复制代码
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef int ElemType;
  4 typedef struct LNode{
  5     ElemType date;
  6     struct LNode *next;//定义一个此链表的结构体类型,指向下一元素
  7 }LinkList;
  8 //建立单链表(头插法) 
  9 void CreateListHead(LinkList *&L, ElemType arr[], int len) {
 10     LinkList *s;
 11     L = (LinkList*)malloc(sizeof(LinkList));
 12     L->next = NULL;
 13     for(int i = 0; i < len; i++) {
 14         s = (LinkList*)malloc(sizeof(LinkList));//在单链表中,每添加一个数据元素,都要分配一个新的空间
 15         s->date = arr[i];
 16         s->next = L->next;
 17         L->next = s;
 18     }
 19 } 
 20 //建立单链表(尾插法)
 21 void CreateListTail(LinkList *&LS, ElemType arrs[], int lens) {
 22     LinkList *p,*q;
 23     p = LS;
 24     for(int i = 0; i < lens; i++) {
 25         q = (LinkList*)malloc(sizeof(LinkList));
 26         q->date = arrs[i];
 27         p->next = q;
 28         p = q;
 29     }
 30     p->next = NULL;
 31 } 
 32 //初始化链表
 33 void InitList(LinkList *&L) {
 34     L = (LinkList*)malloc(sizeof(LinkList));//创建头节点,头节点不存放数据,只用来指引
 35     L->next = NULL;
 36 } 
 37 //求链表长度
 38 void ListLength(LinkList *L) {
 39     int n = 0;
 40     LinkList *p = L;//创建一个此单链表的指针,指向头节点。在修改链表数据时(删除、添加...),头节点不能改变,通过创建指针指向头节点来使用头节点的数据
 41     while(p->next != NULL) {
 42         n++;
 43         p = p->next;
 44     }
 45     printf("%d\n",n);
 46 } 
 47 //按序号查找
 48 void GetElem(LinkList *&L, int k) {
 49     if(k <= 0) {
 50         printf("查找元素位置有误!\n");
 51     } else {
 52         LinkList *p = L;
 53         int i = 0;
 54         while(i < k && p != NULL) {
 55             i++;
 56             p = p->next;
 57         }
 58         if(p == NULL) {
 59             printf("没有找到\n");
 60         } else {
 61             printf("找到了,第%d个元素是%d\n",k,p->date);
 62         }
 63     }
 64 } 
 65 //删除链表元素
 66 void ListDelete(LinkList *&L, int k) {
 67     if(k <= 0) {
 68         printf("删除位置有误!\n");
 69     } else {
 70         LinkList *p = L,*q;
 71         int i = 0;
 72         while(i < k-1 && p != NULL) {
 73             i++;
 74             p = p->next;
 75         }
 76         if(p == NULL) {
 77             printf("链表中无此元素\n");
 78         } else {
 79             q = p->next;
 80             if(q == NULL) {
 81                 printf("链表中无此元素\n");
 82             } else {
 83                 printf("要删除的元素为:%d\n",q->date);
 84                 p->next = q->next;
 85                 free(q);//在单链表中,除添加元素要分配空间外,删除元素要释放空间
 86             }
 87         }
 88     }
 89 } 
 90 //输出链表
 91 void DispList(LinkList *L) {
 92     if(L->next == NULL) {
 93         printf("当前链表为空!\n");
 94     } else {
 95         LinkList *p = L->next;
 96         while(p != NULL) {
 97             printf("%d ",p->date);
 98             p = p->next;
 99         }
100         printf("\n");
101     }
102 } 
103 //销毁链表
104 void DeleteList(LinkList *&L) {
105     LinkList *p = L,*q = L->next;
106     while(q != NULL) {
107         free(p);//释放包括头节点在内的每个节点空间
108         p = q;
109         q = p->next;
110     } 
111     free(p);//释放最后一个数据元素的空间
112 } 
113 int main() {
114     int arr[5] = {1,2,3,4,5};
115     int arrs[5] = {1,2,3,4,5};
116     int len = sizeof(arr)/sizeof(arr[0]);
117     int lens = sizeof(arrs)/sizeof(arrs[0]);
118     LinkList *L;
119     LinkList *LS;
120     InitList(L);
121     CreateListHead(L,arr,len);
122     CreateListTail(LS,arrs,lens);
123     ListLength(L);
124     ListLength(LS);
125     GetElem(L,3);
126     ListDelete(LS,4);
127     DispList(L);
128     DispList(LS);
129     DeleteList(L);
130     return 0;
131 }
2023-12-1219:07:43