算法-线性表之单链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERR 0
#define MAXSIZE 100
typedef int ElemType;

//定义
typedef struct Node
{
ElemType data;
struct Node *next;
}Node,*LinkedList;

//初始化
LinkedList LinkedListInit()
{
Node *L;
L = (Node * )malloc(sizeof(Node));
if (L==NULL)
{
printf("申请内存空间失败.");
}
L->next=NULL;
return L;
}

//单链表的建立1,头插入法建立单链表
LinkedList LinkedListCreateHead()
{
Node *Head;
Head = (Node *)malloc(sizeof(Node));//申请头节点空间
Head->next=NULL;
ElemType x;//x为链表数据域中的数据
while (scanf("%d",&x)!=EOF)
{
Node *P;
P=(Node *)malloc(sizeof(Node));

P->data=x;

P->next=Head->next;

Head->next=P;

}
return Head;
}

//单链表的建立2,尾插入法建立单链表
LinkedList LinkedListCreateTail()
{
//申请头节点
Node *Head;
Head = (Node*)malloc(sizeof(Node));
Head->next=NULL;

//定义Tail始终指向终端结点,开始时指向头结点
Node *Tail;
Tail=Head;

ElemType x;
while (scanf("%d",&x)!=EOF)
{
Node *P = (Node *)malloc(sizeof(Node));//申请新的结点

P->data=x;
Tail->next=P;
Tail=P;
}
Tail->next=NULL;
return Head;

}
//单链表的插入,在链表的第i个位置插入x的元素
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)
{
Node *pre;
pre = L;
int temp=0;
for (temp=1;temp<i;temp++)
pre=pre->next;
Node *P = (Node *)malloc(sizeof(Node));
P->data = x;
P->next=pre->next;
pre->next=P;
return L;

}

//单链表的删除,在链表中删除值为x的元素

LinkedList LinkedListDel(LinkedList L,ElemType x)
{
Node *pre,*p;//p为查找的结点 pre为前驱结点
p=L->next;
while (p->data!=x)
{
pre=p;
p=p->next;

}
pre->next=p->next;
free(p);
return L;

}
//显示单链表数据
void LinkedListShow(LinkedList L)
{
LinkedList temp;
int i=0;
for(i=1,temp = L->next; temp != NULL; i++,temp = temp->next)
printf("(%d)->%d ",i,temp->data);
printf("\n");
}
int main()
{

//键盘中输入EOF方法:press Ctrl+Z on a new line
LinkedList L;
//尾插法建表
printf("请输入单链表的数据:\n");
L=LinkedListCreateTail();
printf("该链表为:\n");
LinkedListShow(L);

int i;
ElemType x;
printf("请输入插入数据的位置和值,用空格隔开:\n");
scanf("%d %d",&i,&x);
LinkedListInsert(L,i,x);
printf("该链表为:\n");
LinkedListShow(L);

printf("请输入要删除的元素的值:");
scanf("%d",&x);
LinkedListDel(L,x);
printf("该链表为:\n");
LinkedListShow(L);

return 0;
}


C

算法-线性表之单链表
https://leehoward.cn/2019/10/15/算法-线性表之单链表/
作者
lihao
发布于
2019年10月15日
许可协议