小新的技术天地

Make It Works !

博客园 首页 新随笔 联系 订阅 管理
由于邮寄名单中的一人已经移民到国外,需要删除把他从名单中删除。
在链表内删除节点又三种不同的情形:
1.删除第一个节点:只需要将head指向第二个节点
2.删除最后一个节点,只需要将指向最后一个节点的指针(引用)指向NULL(null)
3.删除中间节点,只要将需要将指向需要删除节点的指针(引用)指向需要删除节点的下一个节点

C代码:
  1#include<stdio.h>
  2
  3struct llist
  4{
  5    int num;
  6    char name[10];
  7    struct llist *next;
  8}
;
  9typedef struct llist node;
 10typedef node *llink;
 11
 12
 13/*链表的创建*/
 14llink createllist()
 15{
 16    llink head;
 17    llink ptr,ptr1;
 18    int i;
 19    
 20    head = (llink)malloc(sizeof(node));            //分配第一个节点
 21    if(!head)
 22        return NULL;    
 23    printf("请输入六项邮寄数据:\n");
 24    printf("请输入编号 ==> ");
 25    scanf("%d",&head->num);
 26    printf("请输入编号(%d)的姓名 ==> ",head->num);
 27    scanf("%s",head->name);
 28    head->next = NULL;
 29    ptr = head;    
 30    for(i = 1;i < 6; i++)
 31    {
 32        ptr1 = (llink)malloc(sizeof(node));
 33        if(!ptr1)
 34            return NULL;
 35        printf("请输入编号 ==> ");
 36        scanf("%d",&ptr1->num);
 37        printf("请输入编号(%d)的姓名 ==> ",ptr1->num);
 38        scanf("%s",ptr1->name);
 39        ptr1->next = NULL;
 40        ptr -> next = ptr1;
 41        ptr = ptr ->next;
 42    }

 43    return head;
 44}

 45
 46/*链表的节点遍历*/
 47llink findnode(llink head,int num)
 48{
 49    llink ptr;
 50    
 51    ptr = head;
 52    while(ptr != NULL)
 53    {
 54        if(ptr->num == num)
 55            return ptr;
 56        ptr = ptr->next;
 57    }

 58    return ptr;
 59}

 60
 61/*链表的输出*/
 62void printllist(llink ptr)
 63{
 64    while(ptr != NULL)
 65    {
 66        printf("Number:[%d]\n",ptr->num);
 67        printf("Name:%s",ptr->name);
 68        ptr = ptr->next;
 69        printf("\n");
 70    }

 71}

 72
 73/*指定节点的删除*/
 74llink deletenode(llink head,llink ptr)
 75{
 76    llink previous;
 77    
 78    if(ptr == head)                        //如果是第一个节点
 79        return head->next;
 80    else
 81    {
 82        previous = head;
 83        while(previous -> next != ptr)        //找到需要查找节点的前一个节点
 84            previous = previous->next;
 85            
 86        if(ptr->next == NULL)            //链表是否结束
 87            //删除最后一个结点
 88            previous->next = NULL;
 89        else
 90            //删除中间一个节点
 91            previous->next = ptr->next;
 92    }

 93    return head;
 94}

 95
 96
 97void main()
 98{
 99    llink head;
100    llink ptr;
101    int num;
102    
103    head = createllist();
104    if(!head)
105    {
106        printf("内存分配失败!\n");
107        exit(1);
108    }

109    printf("原来的链表:\n");
110    printllist(head);
111    while(1)
112    {
113        printf("请输入要删除的邮寄编号 ==> ");
114        scanf("%d",&num);
115        if(num != -1)
116        {
117            ptr = findnode(head,num);
118            if(!ptr)
119                printf("没有找到\n");
120            else
121            {
122                head = deletenode(head,ptr);
123                printf("删除后的链表:\n");
124                printllist(head);
125            }

126        }

127        else
128            exit(1);
129    }

130}


C#代码:

  1using System;
  2
  3class Node
  4{
  5    private int num;
  6    
  7    public int Num
  8    {
  9        set{num = value;}
 10        get{return num;}
 11    }

 12    
 13    private string name;
 14    
 15    public string Name
 16    {
 17        set{name = value;}
 18        get{return name;}
 19    }

 20    
 21    private Node next;
 22    
 23    public Node Next
 24    {
 25        set{next = value;}
 26        get{return next;}
 27    }

 28    
 29    public void Print()
 30    {
 31        Console.WriteLine("编号:[{0}]",num);
 32        Console.WriteLine("姓名:{0}",name);
 33    }
 
 34}

 35
 36class Llist
 37{
 38    //链表的创建
 39    public static Node CreateLlist()
 40    {
 41        Node head;
 42        Node tempNode,tempNode1;
 43        int i;
 44        
 45      head = new Node();
 46      Console.WriteLine("请输入六项邮寄数据:\n");
 47      Console.WriteLine("请输入编号==>");
 48      head.Num = Convert.ToInt32(Console.ReadLine());
 49      Console.WriteLine("请输入编号({0})的姓名 ==>",head.Num);
 50      head.Name = Console.ReadLine();
 51      head.Next = null;
 52      tempNode = head;
 53      for( i = 1 ;i < 6; i++)
 54      {
 55          tempNode1 = new Node();
 56          Console.WriteLine("请输入编号 ==>");
 57          tempNode1.Num = Convert.ToInt32(Console.ReadLine());
 58          Console.WriteLine("请输入编号({0})的姓名",tempNode1.Num);
 59          tempNode1.Name = Console.ReadLine();
 60          tempNode1.Next = null;
 61          tempNode.Next = tempNode1;
 62          tempNode = tempNode.Next;
 63      }

 64      return head;
 65    }

 66    
 67    //链表的节点遍历
 68    public static Node FindNode(Node head,int num)
 69    {
 70        Node tempNode;
 71        
 72        tempNode = head;
 73        while(tempNode != null)
 74        {
 75            if(tempNode.Num == num)
 76                return tempNode;
 77            tempNode = tempNode.Next;
 78        }

 79        return tempNode;
 80    }

 81    
 82    //链表的输出
 83    public static void PrintLlist(Node tempNode)
 84    {
 85        while( tempNode != null)
 86        {
 87            tempNode.Print();
 88            tempNode = tempNode.Next;
 89        }

 90        Console.WriteLine();
 91    }

 92    
 93    //链表内指定节点的删除
 94    public static Node DeleteNode(Node head,Node tempNode)
 95    {
 96        Node previous;
 97        
 98        if(tempNode == head)            //如果是第一个节点
 99            return head.Next;
100        else
101        {
102            previous = head;
103            while(previous.Next != tempNode)        //找到需要查找节点的前一个节点
104                previous = previous.Next;
105                
106            if(tempNode.Next == null)        //链表是否结束
107                previous.Next = null;            //删除最后一个结点
108            else
109                previous.Next = tempNode.Next;        //删除中间一个节点
110        }

111        return head;    
112    }

113    
114}

115
116class Test
117{
118    public static void Main()
119    {
120        Node head;
121        Node tempNode;
122        int num;
123        
124        head = Llist.CreateLlist();
125        Console.WriteLine("原来的链表:");
126        Llist.PrintLlist(head);
127        while(true)
128        {
129            Console.WriteLine("请输入要删除的邮寄编号 ==>");
130            num = Convert.ToInt32(Console.ReadLine());
131            if(num != -1)
132            {
133                tempNode = Llist.FindNode(head,num);
134                if(tempNode == null)
135                    Console.WriteLine("没有找到\n");
136                else
137                {
138                    head = Llist.DeleteNode(head,tempNode);
139                    Console.WriteLine("删除后的链表:");
140                    Llist.PrintLlist(head);
141                }

142            }

143            else
144                break;
145        }

146    }

147}


 

posted on 2005-05-14 12:57  小新0574  阅读(3551)  评论(3编辑  收藏  举报