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; } } } |