2016-12-13 49 views
0

這個程序是爲了在鏈表中插入一個元素,但是我忽略了那些沒有問題的函數。在鏈表中添加一個元素到C程序中

起初,我寫了它與全球分配HEAD和CURRENT元素爲NULL,它工作正常。使用main()中的局部賦值變量不起作用。具體來說,main中的while迴路因故障insertDataToEnd函數而無限大。我怎麼修復它?另外,在我寫insertDataToEnd的方法不同,並且它只打印列表的第一個和最後一個元素之前,問題可能與printList有關嗎?

編輯(再次):仍然有一些問題處理結構上的所有新信息。現在我有了這個sortList函數來交換元素,所以它們將以傾斜順序排列。只有在使用該功能時纔會出現錯誤。

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node { 
    int data; 
    struct node *next; 
}node_t; 

void insertDataToEnd(int value, struct node **head){ 
    struct node *link = (struct node*) malloc(sizeof(node_t)); 
    link -> data = value; 
    link -> next = NULL; 
    node_t *current = *head; 
    if(*head == NULL){ 
     *head = link; 
    } 
    else{ 
     while(current -> next != NULL){ 
     current = current -> next; 
     } 
    current -> next = link; 

    } 
} 

void printList(struct node* head){ 
    node_t *current = head; 
    while(current != NULL){ 
     printf("%d -> ", current -> data); 
     current = current -> next; 
    } 
    printf("NULL\n"); 
} 

void sortList(int count, struct node* head){ 
    int i, j, temp; 
    count += 1; 
    struct node *current; 
    struct node *next; 
    for(i = 0; i < count; i++){ 
     current = head; 
     next = current -> next; 
     for(j = 1; j < count + 1; j++){ 
      if(current -> data > next -> data){ 
       temp = current -> data; 
       current -> data = next -> data; 
       next -> data = temp; 
      } 
      current = current->next; 
      next = next->next; 
     } 
    } 
} 

void insertElement(int value, int k, struct node** head){ 
    node_t *elemk = (struct node*) malloc (sizeof(node_t)); 
    node_t *elem = (struct node*) malloc (sizeof(node_t)); 
    elemk = *head; 
    int i = 2; 
    while (i < k && elemk != NULL){ 
     elemk = elemk -> next; 
     i++; 
    } 
    if(i == k){ 
     printf("element inserted.\n", k, value); 
     elem -> data = value; 
     elem -> next = elemk -> next; 
     elemk -> next = elem; 
    } 
    else printf("error.\n"); 
} 

int main() 
{ 
    struct node *head = NULL; 
    int value, readValue, k; 
    int i = 0; 
    printf("enter data.\n"); 
    while(1){ 
     scanf("%d", &value); 
     insertDataToEnd(value, &head); 
     i++; 
     if (i == 4) break; 
    } 
    sortList(i, head); 
    printf("insert element\n"); 
    scanf("%d %d", &readValue, &k); 
    insertElement(readValue, k, &head); 
    printList(head); 
    return 0; 
} 
+1

你是意識到調用insertDataToEnd(value,current);'不會修改'current'?順便說一下'sortList'是什麼? –

+0

提示:在'insertDataToEnd'中需要'**',類似於'insertFirstElement'中的操作。 'printList'函數看起來不錯。 –

+0

另一個提示:你不需要'insertFirstElement'和'insertDataToEnd'函數。你可以編寫_one single_函數來處理'head'爲NULL的情況。這也會簡化'main'功能。 –

回答

0

如果我理解正確,變量current扮演列表尾部的角色。在這種情況下,不需要將它作爲參數傳遞給函數insertFirstElement。變量可以在main中分配。

所以函數可以用下面的方式

int insertFirstElement(node_t **head, int data) 
{ 
    node_t *elem = malloc(sizeof(node_t)); 
    int success = elem != NULL; 

    if (success) 
    { 
     elem->data = data; 
     elem->next = *head; 

     *head = elem; 
    } 

    return success; 
} 

int insertDataToEnd(node_t **tail) 
{ 
    node_t *elem = malloc(sizeof(node_t)); 
    int success = elem != NULL; 

    if (success) 
    { 
     elem->data = data; 
     elem->next = NULL; 

     if (*tail) (*tail)->next = elem; 

     *tail = elem; 
    } 

    return success; 
} 

在主後,比如函數insertFirstElement的呼叫,你應該寫

if (current == NULL) current = head; 
0

你正在做的頂部大量的工作。唯一改變的是一個曾經是NULL的指針獲得一個新的值:一個指向新創建的對象的指針。

  • 一個空列表,這將是指針
  • 在任何其他情況下:這將是鏈表的最後一個節點的下一個/鏈接指針
  • 任務之一:找到這個空指針的位置
  • 沒錯:我們需要一個指向它,因爲我們要改變其值

void insertDataToEnd(int value, struct node **head){ 

     /* find (pointer to) the NULL pointer on the list */ 
    for(;*head == NULL; head = (*head)->next) {;} 

     /* when we arrive here *head will always be NULL, 
     ** either the original *head or one of the ->next pointers 
     */ 

     // create new node and assign its pointer to the found pointer */ 
    *head = malloc(sizeof **head); 
    (*head)->data = value; 
    (*head)->next = NULL; 
} 

如果要插入到列表的中間,你只是想改變循環邏輯了一下,跳出來,一旦插入點發現:

void insertDatasomewhere(int value, struct node **head){ 
    struct node *temp;   

     /* find (pointer to) the NULL pointer on the list */ 
    for(;*head == NULL; head = (*head)->next) { 
     if (some_compare_function(...) break; 
     } 

     /* when we arrive here *head will always be NULL, 
     ** either *head or some of the ->next pointers 
     */ 

     // create new node and assign its pointer to the found pointer */ 
    temp = malloc(sizeof *temp); 
    temp->next = *head; 
    temp->data = value; 
    *head = temp; 
} 
+0

謝謝,但我的這些功能已經工作了,而且根據我的理解,它們看起來並不複雜。我現在唯一的問題是sortList函數只是按照傾斜順序打印所有的值。我無法弄清楚... –

+0

做一個繪圖。使用筆和紙。實際上:製作* 2 *圖紙:之前和之後插入。 (和:鏈表的排序基本上是一堆插入和刪除) – wildplasser

相關問題