連結串列基本操作(建立,插入,查詢,刪除)-C語言

ZY_FlyWay發表於2018-01-11

     Demo地址:https://github.com/RainManGO/NodeLink

    工具:Xcode



//
  // main.c
  // Node
  //
  // Created by apple on 2018/1/3.
  // Copyright © 2018年 ZY. All rights reserved.
  //
   
  #include <stdio.h>
  #include <stdlib.h>
   
  typedef struct Student{
  float score;
  struct Student * next;
  }STU;
   
  #pragma mark 連結串列的建立
   
  #if 0
  //頭插入法建表
  STU * creat_LinkList(int n)
  {
  float score;
  STU *head, *p;
  head = (STU *)malloc(sizeof(STU));
  head->next = NULL;
  for (int i=0; i<n; i++) {
  printf("請輸入分數:");
  scanf("%f",&score);
  p = (STU *)malloc(sizeof(STU));
  if (p!=NULL) {
  p->score = score;
  p->next = head->next;
  head->next = p;
  }else{
  printf("分配記憶體失敗");
  }
  }
  return head;
  }
  #else
  //尾插入建表
  STU * creat_LinkList(int n){
  float score;
  STU * head , *p,*q;
  head = p = (STU *)malloc(sizeof(STU));
  p->next=NULL;
   
  for (int i=0; i<n; i++) {
  printf("請輸入分數:");
  scanf("%f",&score);
  q = (STU *)malloc(sizeof(STU));
  if (p!=NULL) {
  q->score = score;
  q->next=p->next;
  p->next = q;
  p=q;
  }else{
  printf("分配記憶體失敗");
  }
  }
  return head;
  }
  #endif
   
  #pragma mark 連結串列的查詢
   
  //指定個數查詢
  float getScore(STU * Node,int i){
  int j = 1;
  STU * p = Node->next;
  while (p->next!=NULL&&j<i){
  p=p->next;
  j++;
  };
  if (i==j) {
  return p->score;
  }else{
  return 0.f;
  }
   
  }
   
   
  //根據資料值查詢節點
   
  STU * getStudent(STU * headLink,float score){
   
  STU * p = headLink;
  while (p->next!=NULL||p->score!=score) {
  p=p->next;
  }
  if (p->score==score) {
  return p;
  }
   
  return NULL;
  }
   
   
  #pragma mark 連結串列的插入
   
  STU * insertStudent(STU * headLink,int i,float score){
  int j=1;
  STU * q;
  STU * p = headLink->next;
  while (p!=NULL &&j<i-1) {
  p=p->next;
  j++;
  }
   
  if (j==i-1) {
  q = (STU*)malloc(sizeof(STU));
  q->score = score;
  q->next=p->next;
  p->next=q;
  }
   
   
  return headLink;
  }
   
  #pragma mark 連結串列的刪除
   
  //刪除第幾個節點
  STU * deleteStudent(STU * headLink,int i){
  int j;
  STU *p,*q;
  p = headLink;j=0;
  q = headLink->next;
  while (p->next!=NULL&&j<i) {
  p=q;
  q=q->next;
  j++;
  }
   
  if (j==i) {
  p->next=q->next;
  free(q);
  }
  return headLink;
  }
   
  //按值刪除所有節點
  STU * deleteStudentByScore(STU * headLink,float score){
  STU *p,*q;
  p = headLink;
  q = headLink->next;
  while (p!=NULL) {
  if (q->score==score) {
  p->next=q->next;
  free(q);
  q=p->next;
  }else{
  p=q;
  q=q->next;
  }
   
  }
   
  return headLink;
  }
   
  //刪除重複節點
   
  void deleteSameDataNode(STU * headLink){
  STU *p,*q,*p1;
  p=headLink->next;
  while (p->next!=NULL) {
  q=p;
  p1=p->next;
  while (p1->next!=NULL) {
  if (p->score==p1->score) {
  q->next=p1->next;
  free(p1);
  p1=q->next;
  }else{
  q=p1;
  p1=p1->next;
  }
  }
  p=p->next;
  }
  }
   
   
  void printfLink(STU * headLink){
  STU * p = headLink->next;
  printf("列印連結串列如下:\n");
  while (p!=NULL) {
  printf("%.2f\n",p->score);
  p=p->next;
  }
  printf("\n");
  }
   
   
   
  int main(int argc, const char * argv[]) {
   
  //建立連結串列
  STU * nodeLink = creat_LinkList(5);
  printfLink(nodeLink);
   
  //根據序號查詢連結串列節點值
  printf("%d個連結串列值為:%.2f\n",3,getScore(nodeLink,3));
   
   
  //連結串列值的插入
  insertStudent(nodeLink,4,6.6);
  printfLink(nodeLink);
   
  //刪除連結串列的值
  deleteStudent(nodeLink,1);
  printfLink(nodeLink);
   
  //刪除重複節點
  deleteSameDataNode(nodeLink);
  printfLink(nodeLink);
  return 0;
  }

列印結果:

請輸入分數:2

請輸入分數:3

請輸入分數:3

請輸入分數:4

請輸入分數:2

列印連結串列如下:

2.00

3.00

3.00

4.00

2.00


3個連結串列值為:3.00

列印連結串列如下:

2.00

3.00

3.00

6.60

4.00

2.00


列印連結串列如下:

2.00

3.00

6.60

4.00

2.00


列印連結串列如下:

2.00

3.00

6.60

4.00

2.00


Program ended with exit code: 0


相關文章