单向链表【数据结构-朱战立】

  1 /*本程序是单链表的创建,其中包括:单链表初始化,链表长度的判断,链表的插入、链表删除、链表取出、链表销毁等*/
  2 #include <stdio.h>
  3 #include <malloc.h>//涉及到动态分配内存,所以要定义头文件
  4 #include <stdlib.h>
  5 
  6 //定义抽象类型
  7 typedef int DataType;
  8 //定义节点
  9 typedef struct node{
 10 
 11     DataType data;
 12     struct node *next;
 13 }SLNode;
 14 
 15 //初始化链表
 16 void LinkInit(SLNode **head)
 17 {
 18     if ((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL)//特别容易犯错误的地方,应该将(*head = (SLNode *)malloc(sizeof(SLNode)))加外括号
 19     {
 20         exit(1);
 21     }
 22     (*head)->next = head;
 23 }
 24 
 25 //判断链表的长度
 26 int LinkLength(SLNode *head)
 27 {
 28     SLNode *p=head;
 29     int num=0;
 30 
 31     while (p->next!=head)
 32     {
 33         
 34         p = p->next; 
 35         num++;
 36         
 37     }
 38     return num;
 39 }
 40 
 41 //插入链表
 42 int LinkInsert(SLNode *head, int i, DataType x)
 43 {
 44     SLNode *p, *q;
 45     int j = -1;
 46     
 47     if((q = (SLNode*)malloc(sizeof(SLNode)))==NULL) exit(1);
 48 
 49     p = head;
 50     while (p->next!=head&&j<i-1)//i-1
 51     {
 52         p = p->next;
 53         j++;
 54     }
 55     if (j!=i-1)
 56     {
 57         printf("error!");
 58         return 0;
 59     }
 60 
 61     q->data = x;
 62         
 63     q->next = p->next;
 64     p->next = q;
 65     return 1;
 66 
 67 }
 68 
 69 //删除链表
 70 int LinkDelete(SLNode *head, int i, DataType *x)
 71 {
 72     SLNode *p,*q;
 73     int j = -1;
 74 
 75     p = head;
 76     while (p->next!=head&&p->next->next!=NULL&&j<i-1)
 77     {
 78         p = p->next;
 79         j++;
 80     }
 81     if (j != i-1)
 82     {
 83         printf("error!");
 84         return 0;
 85     }
 86     q = p->next;
 87     *x = q->data;
 88 
 89     p->next = p->next->next;
 90     free(q);
 91     return 1;
 92 }
 93 
 94 //取出链表
 95 int LinkGet(SLNode *head, int i,DataType *x)
 96 {
 97     SLNode *p;
 98     int j = -1;
 99 
100     p = head;
101     while (p->next!=head&&j<i)
102     {
103         j++;
104         p = p->next;
105     }
106     if (j != i)
107     {
108         printf("error!");
109         return 0;
110     }
111     else
112     {
113         *x = p->data;
114         return 1;
115     }
116 }
117 
118 //清空链表
119 void LinkDestroy(SLNode **head)
120 {
121     SLNode *p, *newp;
122     
123     p = *head;
124     while (p!=head)
125     {
126         newp = p;
127         p = p->next;
128         free(newp);
129     }
130     *head = NULL;
131 }
132 
133 
134 //主函数 应用
135 
136 int main()
137 {
138     SLNode *mylist;
139     int i,x;
140 
141     LinkInit(&mylist);
142     for ( i = 0; i < 10; i++)
143     {
144         if (LinkInsert(mylist,i,i+1)==0)
145         {
146             printf("插入error!\n");
147             getchar();
148             return;
149         }
150     }
151     if (LinkDelete(mylist, 4, &x) == 0)
152     {
153         printf("error!\n");
154         return;
155     }
156     else
157     {
158         printf("删除数字:%d\n", x);
159     }
160     for ( i = 0; i < 9; i++)
161     {
162         if (LinkGet(mylist, i, &x) == 0)
163         {
164             printf("error!\n");
165             return;
166         }
167         else
168         {
169             printf("%d    ", x);
170         }
171     }
172     LinkDestroy(&mylist);
173     getchar();
174     getchar();
175     return 0;
176 }

 

转载于:https://www.cnblogs.com/leime/p/9477788.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值