« 郁闷--单位食堂的包子。 | 首页 | 又浪费了一天的时光。 »

C语言链表例程。

大学的论坛上的一个同学要的。写在这里算留个备份吧。
c++ builder 6下通过。

Code:


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

/*构建结点结构体 */
typedef struct LNode{
       int data;
       struct LNode * next;
}LNode, * LinkList;
/*用于创建链表的函数 */
/*反序构建的*/
LinkList CreateList_L(LinkList L, int n)
{
       int i;
       LinkList p;
       L = (LinkList)malloc(sizeof(LNode));
       L->next = NULL;
       for(i = n; i > 0; --i)
       {
               p = (LinkList)malloc(sizeof(LNode));
               scanf("%d",&p->data);
               p->next = L->next;
               L->next = p;
        }
       return L;
}
/* 用于插入结点的函数 */

LinkList ListInsert_L(LinkList L, int i, int newnode)
{
       LinkList p = L;
       LinkList s;
       int j = 0;
       while(p&&j<i-1)
       {
               p = p->next;
               ++j;
        }
       if(!p||j>i-1)
       {
               printf("位置小于1或大于表长。\n");
               return L;
        }
       s = (LinkList)malloc(sizeof(LNode));
       s->data = newnode;
       s->next = p->next;
       p->next = s;
       return L;

}

/* 用于删除结点的函数 */

LinkList ListDelete_L(LinkList L, int i)
{
       LinkList p = L;
       LinkList s;
       int j=0;
       while(p->next&&j<i-1)
       {
               p = p->next;
               ++j;
        }
       if(!(p->next)||j>i-1)
       {
               printf("删除位置不合理。\n");
               return L;
        }
       s = p->next;
       p->next = s->next;
       printf("%s%d\n","被删除的结点是:",s->data);
       free(s);
       return L;
}


/*用于遍历链表的函数 */
void ListDisp_L(LinkList L)
{
       LinkList p;
       int i=0;
       p = L->next;

       while(p)
       {
               printf("%d:%d\n", ++i,p->data);
               p = p->next;
        }

}


/* 选择排序算法 网上找来的 我自己写的老报错误 */

LinkList ListSort_L(LinkList L)
{
       LinkList h1,p,q,r,s;
       h1=p=(LinkList)malloc(sizeof(LinkList));
       p->next=L;
       while(p->next)
       {
               q=p->next;
               r=p;
               while(q->next)
               {
                       if(q->next->data < r->next->data)
                               r=q;
                       q=q->next;
                }
               if(r!=p)
               {
                       s=r->next;
                       r->next=s->next;
                       s->next=p->next;
                       p->next=s;
                }
               p=p->next;
        }
       L=h1->next;
       free(h1);
       return L;
}

int getoptions()
{
       int opt;
       printf("1: 录入链表\n");
       printf("2: 显示链表\n");
       printf("3: 插入结点\n");
       printf("4: 删除结点\n");
       printf("5: 排序链表\n");
       printf("6: 退出\n");
       printf("输入选项并按回车确认:");
       scanf("%d",&opt);
       return opt;
}



int main(int argc, char* argv[])
{
       int opt;
       int where;
       int value;
       int count;
       LinkList L;
       while(1)
       {
               clrscr();
               opt = getoptions();
               if(opt == 1)
               {
                       clrscr();
                       printf("请输入链表初始结点数:");
                       scanf("%d",&count);
                       printf("请输入各个结点数值,每输入一个按回车确认:\n");
                       L = CreateList_L(L, count);
                       clrscr();
                       ListDisp_L(L);
                       system("PAUSE");
                       continue;
                }
               if(opt == 2)
               {
                       clrscr();
                       ListDisp_L(L);
                       system("PAUSE");
                       continue;
                }
               if(opt == 3)
               {
                       clrscr();
                       ListDisp_L(L);
                       printf("请输入插入位置:");
                       scanf("%d", &where);
                       printf("请输入要插入的数值:");
                       scanf("%d", &value);
                       clrscr();
                       L = ListInsert_L(L,where,value);
                       ListDisp_L(L);
                       system("PAUSE");
                       continue;
                }
               if(opt == 4)
               {
                       clrscr();
                       ListDisp_L(L);
                       printf("请输入要删除的位置:");
                       scanf("%d",&where);
                       clrscr();
                       L = ListDelete_L(L,where);
                       ListDisp_L(L);
                       system("PAUSE");
                       continue;
                }
               if(opt == 5)
               {
                       clrscr();
                       L = ListSort_L(L);
                       ListDisp_L(L);
                       system("PAUSE");
                       continue;
                }
               if(opt == 6)
               {
                       return 0;
                }

        }  

}


引用:

本篇引用地址:
http://www.vetcafe.net/cgi-bin/mt3/mt-tb.cgi/2284

发表评论

(如果您以前没在这里发表过评论,也许您发表的评论需要Blog主人的审核才能显示在这里,感谢您的静候。)