在進行單鏈表的基本運算之前必須先建立單鏈表,建立單鏈表的常用方法有兩種:頭插法建表和尾插法建表
頭插法建表,從一個空表開始,讀取字符數組a中的字符,生成新節點,將讀取的數據存放到新節點的數據域中,然后將新節點插入到當前鏈表的表頭上,直到讀完字符數組a的所有元素為止。
頭插法建表雖然簡單,但生成的鏈表中節點的次序和原數組的次序相反,若希望兩者的次序一致,可采用尾插法建立
尾插法建表,該算法是將新節點插到當前鏈表的表尾上,為此必須增加一個尾指針r,使其始終指向當前鏈表的尾節點
前插法
#include <stdio.h>
#include <stdlib.h>
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("申請內存空間失敗\n");
}
L->next = NULL;
return L;
}
LinkedList LinkedListCreatH() {
Node *L;
L = (Node *)malloc(sizeof(Node));
L->next = NULL;
ElemType x;
while(scanf("%d",&x) != EOF) {
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) {
Node *pre;
pre = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++) {
pre = pre->next;
}
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = pre->next;
pre->next = p;
return L;
}
LinkedList LinkedListDelete(LinkedList L,ElemType x)
{
Node *p,*pre;
p = L->next;
pre = L;
/************************** 添加上 per = L; 就行了 原因 : 剛開始 per 沒有賦值如果刪除第一個元素 可能造成因為per為空指針的情況下指針失陪的情況 ***************************/
while(p->data != x) {
pre = p;
p = p->next;
}
pre->next = p->next;
free(p);
return L;
}
int findder(LinkedList L,int x) { //查找功能
/* * @ x 所要查找的值 * @ L 所要操作的鏈表 * 返回 -1 時表示鏈表中沒有所在得值 */
LinkedList start; int i = 1;
L = L->next;
for (start = L;start != NULL;start = start->next) {
if ( start->data == x ) {
return i;
}
i++;
}
return -1;
}
LinkedList Delete(LinkedList L,int st,int en) { // 多組數據刪除功能
/* * @ st 刪除的起始位置 * @ en 刪除的終止為止 * @ L 所要操作的的鏈表 */
bool flag1 = false;
Node *per,*p;
per = L;
L = L->next; int i = 1;
LinkedList start;
for (start = L;start != NULL ; start = start->next ) {
if ( st == i ) {
flag1 = true;
}
if ( en == i ) {
per->next = start->next;
break;
}
i++;
if ( !flag1 )
per = start;
}
return L;
}
int main() {
LinkedList list,start;
printf("請輸入單鏈表的數據:");
list = LinkedListCreatH();
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
int i;
ElemType x;
printf("請輸入插入數據的位置:");
scanf("%d",&i);
printf("請輸入插入數據的值:");
scanf("%d",&x);
LinkedListInsert(list,i,x);
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
printf("請輸入要刪除的元素的值:");
scanf("%d",&x);
LinkedListDelete(list,x);
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
return 0;
}
后插法
#include <stdio.h>
#include <stdlib.h>
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("申請內存空間失敗\n");
}
L->next = NULL;
return L;
}
void LinkedListCreatH(LinkedList &list) {
Node *L,*s;
list = new Node; list->next = NULL;
L = list; ElemType x;
while ( ~scanf("%d",&x) ) {
s = new Node;
s->data = x; s->next = L->next; L->next = s;
L = s;
}
}
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x) {
Node *pre;
pre = L;
int tempi = 0;
for (tempi = 1; tempi < i; tempi++) {
pre = pre->next;
}
Node *p;
p = (Node *)malloc(sizeof(Node));
p->data = x;
p->next = pre->next;
pre->next = p;
return L;
}
LinkedList LinkedListDelete(LinkedList L,ElemType x)
{
Node *p,*pre;
p = L->next;
pre = L;
while(p->data != x) {
pre = p;
p = p->next;
}
pre->next = p->next;
free(p);
return L;
}
int main() {
LinkedList list,start;
printf("請輸入單鏈表的數據:");
LinkedListCreatH(list);
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
int i;
ElemType x;
printf("請輸入插入數據的位置:");
scanf("%d",&i);
printf("請輸入插入數據的值:");
scanf("%d",&x);
LinkedListInsert(list,i,x);
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
printf("請輸入要刪除的元素的值:");
scanf("%d",&x);
LinkedListDelete(list,x);
for(start = list->next; start != NULL; start = start->next) {
printf("%d ",start->data);
}
printf("\n");
return 0;
}