我的第一本算法书——链表的C语言实现
说明
改代码实现了链表的可选择初始化,链表结点的插入和删除,对于无效删除做出了处理。
代码片段
#include <stdio.h>
#include <stdlib.h>
typedef struct list
{
int x;
struct list *next;
} T;
T *head = NULL;
T *pre = NULL;
T *cur = NULL;
void bianlilist(void); /* 顺次遍历链表输出数据 */
void deletelist(void); /* 删除一个数据 */
void addlist(void); /* 添加一个数据 */
int freal(void);
int main()
{
puts("Please enter a number, i will build a list from 0 to the number, if you don't need, you can enter the number 0.");
int n;
scanf("%d", &n);
getchar();
/* 创建一个链表,从0到99依次放入数据 */
for (int i = 0; i < n; i++)
{
cur = (T *)malloc(sizeof(T));
cur->next = NULL;
if (head == NULL)
head = cur;
else
pre->next = cur;
cur->x = i;
pre = cur;
}
while (1)
{
int c = freal();
if (c)
break;
}
while (getchar() != '\n')
;
return 0;
}
void bianlilist(void) /* 顺次遍历链表输出数据 */
{
T *ps = head;
int flag = 0;
while (ps != NULL)
{
if (flag == 0)
{
printf("%d", ps->x);
flag++;
}
else
printf(" - %d", ps->x);
ps = ps->next;
}
putchar('\n');
}
void deletelist(void) /* 删除一个数据 */
{
printf("\nPlease enter the number which you want to delete: ");
int y;
scanf("%d", &y);
getchar();
T *ps = head;
T *temp;
if (head->x == y)
{
temp = head;
head = head->next;
free(temp);
return;
}
int flag=0;
while (1)
{
if(ps->next==NULL)
{
puts("Invalid input! Please enter again!");
return;
}
if(ps->next->x != y)
ps = ps->next;
else
break;
}
temp = ps->next;
ps->next = temp->next;
free(temp);
}
void addlist(void) /* 添加一个数据 */
{
int y;
printf("\nPlease enter the number which you want to add: ");
scanf("%d", &y);
getchar();
T *ps = head;
T *temp = (T *)malloc(sizeof(T));
temp->x = y;
temp->next=NULL;
if (head == NULL)
{
head = temp;
return;
}
if (y < head->x)
{
temp->next = head;
head = temp;
return;
}
while (1)
{
if (ps->next == NULL)
{
ps->next = temp;
return;
}
if (ps->next->x >= y)
break;
else
ps = ps->next;
}
temp->next = ps->next;
ps->next = temp;
}
int freal(void)
{
printf("What function do you want to realize?\n");
puts("a.Add a element. b.Delete a element");
puts("c.Output the list. d.Quit program.");
char ch = getchar();
getchar();
switch (ch)
{
case 'a':
addlist();
break;
case 'b':
deletelist();
break;
case 'c':
bianlilist();
break;
case 'd':
return 1;
default:
puts("Invalid input! Please enter again!");
}
return 0;
}