資料結構—連結串列的前插法與後插法
阿新 • • 發佈:2018-12-19
在進行單鏈表的基本運算之前必須先建立單鏈表,建立單鏈表的常用方法有兩種:頭插法建表和尾插法建表
頭插法建表,從一個空表開始,讀取字元陣列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;
}