1. 程式人生 > >單鏈表的建立、插入和刪除操作

單鏈表的建立、插入和刪除操作

單鏈表的建立、插入和刪除操作

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct List
{

    ElemType data;      //資料域
    struct List *next;  //指標域
} Node, *LinkedList;

//頭插法建立連結串列,將新增節點插頭第一個節點之前
LinkedList createH()
{
    Node *L = (Node *)malloc(sizeof(Node));     //申請一個數據域為空的頭節點
if(L == NULL) { printf("分配空間失敗!\n"); exit(0); } L->next = NULL; int nodeNum; printf("輸入節點數量: "); scanf("%d",&nodeNum); printf("\n"); printf("輸入節點資料: "); for(int i=0; i<nodeNum; i++) //依次插入節點 { ElemType data; scanf
("%d",&data); Node *p = (Node *)malloc(sizeof(Node)); //申請節點空間 if(p == NULL) { printf("分配空間失敗!\n"); exit(0); } p->data = data; p->next = L->next; //頭結點指向新增節點 L->next = p; //新增節點指向第一個節點
} return L; //返回頭節點 } //尾插法建立連結串列,新增節點插入最後一個節點之後 LinkedList createT() { Node *L, *pre; L = (Node*)malloc(sizeof(Node)); //為頭結點申請空間 if(L == NULL) //判斷是否申請失敗 { printf("申請記憶體失敗!\n"); exit(0); } L->next = NULL; pre = L; //pre始終指向連結串列尾部 int nodeNum; printf("輸入節點數量: "); scanf("%d",&nodeNum); printf("\n"); printf("輸入節點資料: "); ElemType data; for(int i=0; i<nodeNum; i++) { scanf("%d",&data); Node *p = (Node *)malloc(sizeof(Node)); //為新增節點分配空間 if(p == NULL) { printf("申請記憶體失敗!\n"); exit(0); } p->data = data; p->next = NULL; pre->next = p; //新增節點插入連結串列尾部 pre = pre->next; //pre移到尾部 } return L; } //在指定位置插入節點 void insertNode(LinkedList L) { int pos; //插入位置 ElemType data; //插入節點資料 printf("輸入插入位置, 插入節點的資料: "); scanf("%d %d",&pos,&data); LinkedList p = L; //指標p查詢插入位置 int cnt = 0; while(cnt<pos) { if(p->next == NULL && cnt<pos) //判斷插入位置是否大於連結串列長度 { printf("超出連結串列長度\n"); return; // exit(0); } p = p->next; //指標p一直滑動到要插入的位置 cnt++; } Node *r = (Node *)malloc(sizeof(Node)); //為插入節點申請空間 r->data = data; r->next = p->next; //插入連結串列對應位置 p->next = r; } //刪除連結串列中的一個數據為x的節點 void deleteNode(LinkedList L) { ElemType data; printf("輸出要刪除的資料: "); scanf("%d",&data); LinkedList p = L; //p節點進行查詢 LinkedList r = L->next; //r表示p節點後的一個節點 if(L->next==NULL) //判斷連結串列是否為空 { printf("連結串列為空!\n"); return; // exit(0); } while(r->next!=NULL) //找到要刪除資料的位置 { printf("test\n"); if(r->data == data) break; p = p->next; r = r->next; } if(r->data != data) //判斷連結串列中是否存在要刪除的資料 { printf("連結串列中未找到要刪除的資料!\n"); // exit(0); return; } p->next = r->next; //刪除操作 free(r); //釋放刪除節點的記憶體 } //將連結串列各個節點的資料打印出來 void printList(LinkedList L) { LinkedList p; if(L->next==NULL) { //判斷連結串列是否為空 printf("連結串列為空!\n"); return; } p = L->next; while(p->next!=NULL) { printf("%d->",p->data); p = p->next; } printf("%d\n",p->data); } int main() { LinkedList li; int option; printf("輸入要進行的操作\n"); printf("-----------------\n"); printf("1 頭插法建立連結串列\n"); printf("2 尾插法插法建立連結串列\n"); printf("3 插入節點\n"); printf("4 刪除節點\n"); printf("0 退出\n"); while(scanf("%d",&option)&&option!=0) //輸入指令 { switch (option) { case 1: li = createH(); //頭插法建立連結串列 printList(li); //列印連結串列 break; case 2: createT(); //尾插法建立連結串列 printList(li); //列印連結串列 break; case 3: insertNode(li); //插入節點 printList(li); //列印連結串列 break; case 4: deleteNode(li); //刪除節點 printList(li); //列印連結串列 break; } printf("輸入要進行的操作: "); } return 0; }

程式碼參考於https://www.cnblogs.com/newwy/archive/2010/10/10/1847456.html